jdk/src/share/classes/sun/font/SunFontManager.java
author ohair
Wed, 06 Apr 2011 22:06:11 -0700
changeset 9035 1255eb81cc2f
parent 7950 dc8f97e15f9b
child 9050 26c2c1de1631
permissions -rw-r--r--
7033660: Update copyright year to 2011 on any files changed in 2011 Reviewed-by: dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
     1
/*
9035
1255eb81cc2f 7033660: Update copyright year to 2011 on any files changed in 2011
ohair
parents: 7950
diff changeset
     2
 * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
     4
 *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5275
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5275
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    10
 *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    15
 * accompanied this code).
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    16
 *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5275
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5275
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 5275
diff changeset
    23
 * questions.
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    24
 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    25
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    26
package sun.font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    27
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    28
import java.awt.Font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    29
import java.awt.FontFormatException;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    30
import java.io.BufferedReader;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    31
import java.io.File;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    32
import java.io.FileInputStream;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    33
import java.io.FilenameFilter;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    34
import java.io.IOException;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    35
import java.io.InputStreamReader;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    36
import java.security.AccessController;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    37
import java.security.PrivilegedAction;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    38
import java.util.ArrayList;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    39
import java.util.HashMap;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    40
import java.util.HashSet;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    41
import java.util.Hashtable;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    42
import java.util.Iterator;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    43
import java.util.Locale;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    44
import java.util.Map;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    45
import java.util.NoSuchElementException;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    46
import java.util.StringTokenizer;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    47
import java.util.TreeMap;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    48
import java.util.Vector;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    49
import java.util.concurrent.ConcurrentHashMap;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    50
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    51
import javax.swing.plaf.FontUIResource;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    52
import sun.awt.AppContext;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    53
import sun.awt.FontConfiguration;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    54
import sun.awt.SunToolkit;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    55
import sun.java2d.FontSupport;
3938
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 3929
diff changeset
    56
import sun.util.logging.PlatformLogger;
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    57
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    58
/**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    59
 * The base implementation of the {@link FontManager} interface. It implements
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    60
 * the platform independent, shared parts of OpenJDK's FontManager
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    61
 * implementations. The platform specific parts are declared as abstract
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    62
 * methods that have to be implemented by specific implementations.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    63
 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    64
public abstract class SunFontManager implements FontSupport, FontManagerForSGE {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    65
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    66
    private static class TTFilter implements FilenameFilter {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    67
        public boolean accept(File dir,String name) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    68
            /* all conveniently have the same suffix length */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    69
            int offset = name.length()-4;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    70
            if (offset <= 0) { /* must be at least A.ttf */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    71
                return false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    72
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    73
                return(name.startsWith(".ttf", offset) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    74
                       name.startsWith(".TTF", offset) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    75
                       name.startsWith(".ttc", offset) ||
5578
c25ebb5bc2d6 6954424: Support OpenType/CFF fonts in JDK 7
prr
parents: 5275
diff changeset
    76
                       name.startsWith(".TTC", offset) ||
c25ebb5bc2d6 6954424: Support OpenType/CFF fonts in JDK 7
prr
parents: 5275
diff changeset
    77
                       name.startsWith(".otf", offset) ||
c25ebb5bc2d6 6954424: Support OpenType/CFF fonts in JDK 7
prr
parents: 5275
diff changeset
    78
                       name.startsWith(".OTF", offset));
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    79
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    80
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    81
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    82
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    83
    private static class T1Filter implements FilenameFilter {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    84
        public boolean accept(File dir,String name) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    85
            if (noType1Font) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    86
                return false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    87
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    88
            /* all conveniently have the same suffix length */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    89
            int offset = name.length()-4;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    90
            if (offset <= 0) { /* must be at least A.pfa */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    91
                return false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    92
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    93
                return(name.startsWith(".pfa", offset) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    94
                       name.startsWith(".pfb", offset) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    95
                       name.startsWith(".PFA", offset) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    96
                       name.startsWith(".PFB", offset));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    97
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    98
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
    99
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   100
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   101
     private static class TTorT1Filter implements FilenameFilter {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   102
        public boolean accept(File dir, String name) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   103
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   104
            /* all conveniently have the same suffix length */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   105
            int offset = name.length()-4;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   106
            if (offset <= 0) { /* must be at least A.ttf or A.pfa */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   107
                return false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   108
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   109
                boolean isTT =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   110
                    name.startsWith(".ttf", offset) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   111
                    name.startsWith(".TTF", offset) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   112
                    name.startsWith(".ttc", offset) ||
5578
c25ebb5bc2d6 6954424: Support OpenType/CFF fonts in JDK 7
prr
parents: 5275
diff changeset
   113
                    name.startsWith(".TTC", offset) ||
c25ebb5bc2d6 6954424: Support OpenType/CFF fonts in JDK 7
prr
parents: 5275
diff changeset
   114
                    name.startsWith(".otf", offset) ||
c25ebb5bc2d6 6954424: Support OpenType/CFF fonts in JDK 7
prr
parents: 5275
diff changeset
   115
                    name.startsWith(".OTF", offset);
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   116
                if (isTT) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   117
                    return true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   118
                } else if (noType1Font) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   119
                    return false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   120
                } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   121
                    return(name.startsWith(".pfa", offset) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   122
                           name.startsWith(".pfb", offset) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   123
                           name.startsWith(".PFA", offset) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   124
                           name.startsWith(".PFB", offset));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   125
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   126
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   127
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   128
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   129
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   130
     public static final int FONTFORMAT_NONE = -1;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   131
     public static final int FONTFORMAT_TRUETYPE = 0;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   132
     public static final int FONTFORMAT_TYPE1 = 1;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   133
     public static final int FONTFORMAT_T2K = 2;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   134
     public static final int FONTFORMAT_TTC = 3;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   135
     public static final int FONTFORMAT_COMPOSITE = 4;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   136
     public static final int FONTFORMAT_NATIVE = 5;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   137
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   138
     /* Pool of 20 font file channels chosen because some UTF-8 locale
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   139
      * composite fonts can use up to 16 platform fonts (including the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   140
      * Lucida fall back). This should prevent channel thrashing when
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   141
      * dealing with one of these fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   142
      * The pool array stores the fonts, rather than directly referencing
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   143
      * the channels, as the font needs to do the open/close work.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   144
      */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   145
     private static final int CHANNELPOOLSIZE = 20;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   146
     private int lastPoolIndex = 0;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   147
     private FileFont fontFileCache[] = new FileFont[CHANNELPOOLSIZE];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   148
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   149
    /* Need to implement a simple linked list scheme for fast
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   150
     * traversal and lookup.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   151
     * Also want to "fast path" dialog so there's minimal overhead.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   152
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   153
    /* There are at exactly 20 composite fonts: 5 faces (but some are not
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   154
     * usually different), in 4 styles. The array may be auto-expanded
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   155
     * later if more are needed, eg for user-defined composites or locale
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   156
     * variants.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   157
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   158
    private int maxCompFont = 0;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   159
    private CompositeFont [] compFonts = new CompositeFont[20];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   160
    private ConcurrentHashMap<String, CompositeFont>
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   161
        compositeFonts = new ConcurrentHashMap<String, CompositeFont>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   162
    private ConcurrentHashMap<String, PhysicalFont>
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   163
        physicalFonts = new ConcurrentHashMap<String, PhysicalFont>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   164
    private ConcurrentHashMap<String, PhysicalFont>
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   165
        registeredFonts = new ConcurrentHashMap<String, PhysicalFont>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   166
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   167
    /* given a full name find the Font. Remind: there's duplication
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   168
     * here in that this contains the content of compositeFonts +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   169
     * physicalFonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   170
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   171
    private ConcurrentHashMap<String, Font2D>
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   172
        fullNameToFont = new ConcurrentHashMap<String, Font2D>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   173
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   174
    /* TrueType fonts have localised names. Support searching all
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   175
     * of these before giving up on a name.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   176
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   177
    private HashMap<String, TrueTypeFont> localeFullNamesToFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   178
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   179
    private PhysicalFont defaultPhysicalFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   180
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   181
    static boolean longAddresses;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   182
    private boolean loaded1dot0Fonts = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   183
    boolean loadedAllFonts = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   184
    boolean loadedAllFontFiles = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   185
    HashMap<String,String> jreFontMap;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   186
    HashSet<String> jreLucidaFontFiles;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   187
    String[] jreOtherFontFiles;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   188
    boolean noOtherJREFontFiles = false; // initial assumption.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   189
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   190
    public static final String lucidaFontName = "Lucida Sans Regular";
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   191
    public static String jreLibDirName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   192
    public static String jreFontDirName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   193
    private static HashSet<String> missingFontFiles = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   194
    private String defaultFontName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   195
    private String defaultFontFileName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   196
    protected HashSet registeredFontFiles = new HashSet();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   197
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   198
    private ArrayList badFonts;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   199
    /* fontPath is the location of all fonts on the system, excluding the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   200
     * JRE's own font directory but including any path specified using the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   201
     * sun.java2d.fontpath property. Together with that property,  it is
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   202
     * initialised by the getPlatformFontPath() method
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   203
     * This call must be followed by a call to registerFontDirs(fontPath)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   204
     * once any extra debugging path has been appended.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   205
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   206
    protected String fontPath;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   207
    private FontConfiguration fontConfig;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   208
    /* discoveredAllFonts is set to true when all fonts on the font path are
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   209
     * discovered. This usually also implies opening, validating and
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   210
     * registering, but an implementation may be optimized to avold this.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   211
     * So see also "loadedAllFontFiles"
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   212
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   213
    private boolean discoveredAllFonts = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   214
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   215
    /* No need to keep consing up new instances - reuse a singleton.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   216
     * The trade-off is that these objects don't get GC'd.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   217
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   218
    private static final FilenameFilter ttFilter = new TTFilter();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   219
    private static final FilenameFilter t1Filter = new T1Filter();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   220
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   221
    private Font[] allFonts;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   222
    private String[] allFamilies; // cache for default locale only
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   223
    private Locale lastDefaultLocale;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   224
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   225
    public static boolean noType1Font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   226
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   227
    /* Used to indicate required return type from toArray(..); */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   228
    private static String[] STR_ARRAY = new String[0];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   229
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   230
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   231
     * Deprecated, unsupported hack - actually invokes a bug!
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   232
     * Left in for a customer, don't remove.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   233
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   234
    private boolean usePlatformFontMetrics = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   235
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   236
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   237
     * Returns the global SunFontManager instance. This is similar to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   238
     * {@link FontManagerFactory#getInstance()} but it returns a
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   239
     * SunFontManager instance instead. This is only used in internal classes
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   240
     * where we can safely assume that a SunFontManager is to be used.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   241
     *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   242
     * @return the global SunFontManager instance
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   243
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   244
    public static SunFontManager getInstance() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   245
        FontManager fm = FontManagerFactory.getInstance();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   246
        return (SunFontManager) fm;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   247
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   248
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   249
    public FilenameFilter getTrueTypeFilter() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   250
        return ttFilter;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   251
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   252
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   253
    public FilenameFilter getType1Filter() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   254
        return t1Filter;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   255
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   256
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   257
    @Override
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   258
    public boolean usingPerAppContextComposites() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   259
        return _usingPerAppContextComposites;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   260
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   261
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   262
    private void initJREFontMap() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   263
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   264
        /* Key is familyname+style value as an int.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   265
         * Value is filename containing the font.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   266
         * If no mapping exists, it means there is no font file for the style
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   267
         * If the mapping exists but the file doesn't exist in the deferred
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   268
         * list then it means its not installed.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   269
         * This looks like a lot of code and strings but if it saves even
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   270
         * a single file being opened at JRE start-up there's a big payoff.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   271
         * Lucida Sans is probably the only important case as the others
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   272
         * are rarely used. Consider removing the other mappings if there's
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   273
         * no evidence they are useful in practice.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   274
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   275
        jreFontMap = new HashMap<String,String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   276
        jreLucidaFontFiles = new HashSet<String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   277
        if (isOpenJDK()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   278
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   279
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   280
        /* Lucida Sans Family */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   281
        jreFontMap.put("lucida sans0",   "LucidaSansRegular.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   282
        jreFontMap.put("lucida sans1",   "LucidaSansDemiBold.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   283
        /* Lucida Sans full names (map Bold and DemiBold to same file) */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   284
        jreFontMap.put("lucida sans regular0", "LucidaSansRegular.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   285
        jreFontMap.put("lucida sans regular1", "LucidaSansDemiBold.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   286
        jreFontMap.put("lucida sans bold1", "LucidaSansDemiBold.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   287
        jreFontMap.put("lucida sans demibold1", "LucidaSansDemiBold.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   288
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   289
        /* Lucida Sans Typewriter Family */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   290
        jreFontMap.put("lucida sans typewriter0",
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   291
                       "LucidaTypewriterRegular.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   292
        jreFontMap.put("lucida sans typewriter1", "LucidaTypewriterBold.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   293
        /* Typewriter full names (map Bold and DemiBold to same file) */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   294
        jreFontMap.put("lucida sans typewriter regular0",
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   295
                       "LucidaTypewriter.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   296
        jreFontMap.put("lucida sans typewriter regular1",
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   297
                       "LucidaTypewriterBold.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   298
        jreFontMap.put("lucida sans typewriter bold1",
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   299
                       "LucidaTypewriterBold.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   300
        jreFontMap.put("lucida sans typewriter demibold1",
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   301
                       "LucidaTypewriterBold.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   302
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   303
        /* Lucida Bright Family */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   304
        jreFontMap.put("lucida bright0", "LucidaBrightRegular.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   305
        jreFontMap.put("lucida bright1", "LucidaBrightDemiBold.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   306
        jreFontMap.put("lucida bright2", "LucidaBrightItalic.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   307
        jreFontMap.put("lucida bright3", "LucidaBrightDemiItalic.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   308
        /* Lucida Bright full names (map Bold and DemiBold to same file) */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   309
        jreFontMap.put("lucida bright regular0", "LucidaBrightRegular.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   310
        jreFontMap.put("lucida bright regular1", "LucidaBrightDemiBold.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   311
        jreFontMap.put("lucida bright regular2", "LucidaBrightItalic.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   312
        jreFontMap.put("lucida bright regular3", "LucidaBrightDemiItalic.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   313
        jreFontMap.put("lucida bright bold1", "LucidaBrightDemiBold.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   314
        jreFontMap.put("lucida bright bold3", "LucidaBrightDemiItalic.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   315
        jreFontMap.put("lucida bright demibold1", "LucidaBrightDemiBold.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   316
        jreFontMap.put("lucida bright demibold3","LucidaBrightDemiItalic.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   317
        jreFontMap.put("lucida bright italic2", "LucidaBrightItalic.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   318
        jreFontMap.put("lucida bright italic3", "LucidaBrightDemiItalic.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   319
        jreFontMap.put("lucida bright bold italic3",
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   320
                       "LucidaBrightDemiItalic.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   321
        jreFontMap.put("lucida bright demibold italic3",
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   322
                       "LucidaBrightDemiItalic.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   323
        for (String ffile : jreFontMap.values()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   324
            jreLucidaFontFiles.add(ffile);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   325
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   326
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   327
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   328
    static {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   329
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   330
        java.security.AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   331
                                    new java.security.PrivilegedAction() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   332
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   333
           public Object run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   334
               FontManagerNativeLibrary.load();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   335
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   336
               // JNI throws an exception if a class/method/field is not found,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   337
               // so there's no need to do anything explicit here.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   338
               initIDs();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   339
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   340
               switch (StrikeCache.nativeAddressSize) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   341
               case 8: longAddresses = true; break;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   342
               case 4: longAddresses = false; break;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   343
               default: throw new RuntimeException("Unexpected address size");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   344
               }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   345
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   346
               noType1Font =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   347
                   "true".equals(System.getProperty("sun.java2d.noType1Font"));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   348
               jreLibDirName =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   349
                   System.getProperty("java.home","") + File.separator + "lib";
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   350
               jreFontDirName = jreLibDirName + File.separator + "fonts";
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   351
               File lucidaFile =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   352
                   new File(jreFontDirName + File.separator + FontUtilities.LUCIDA_FILE_NAME);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   353
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   354
               return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   355
           }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   356
        });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   357
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   358
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   359
    public TrueTypeFont getEUDCFont() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   360
        // Overridden in Windows.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   361
        return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   362
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   363
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   364
    /* Initialise ptrs used by JNI methods */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   365
    private static native void initIDs();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   366
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   367
    @SuppressWarnings("unchecked")
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   368
    protected SunFontManager() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   369
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   370
        initJREFontMap();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   371
        java.security.AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   372
                new java.security.PrivilegedAction() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   373
                    public Object run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   374
                        File badFontFile =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   375
                            new File(jreFontDirName + File.separator +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   376
                                     "badfonts.txt");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   377
                        if (badFontFile.exists()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   378
                            FileInputStream fis = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   379
                            try {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   380
                                badFonts = new ArrayList();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   381
                                fis = new FileInputStream(badFontFile);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   382
                                InputStreamReader isr = new InputStreamReader(fis);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   383
                                BufferedReader br = new BufferedReader(isr);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   384
                                while (true) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   385
                                    String name = br.readLine();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   386
                                    if (name == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   387
                                        break;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   388
                                    } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   389
                                        if (FontUtilities.debugFonts()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   390
                                            FontUtilities.getLogger().warning("read bad font: " +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   391
                                                           name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   392
                                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   393
                                        badFonts.add(name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   394
                                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   395
                                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   396
                            } catch (IOException e) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   397
                                try {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   398
                                    if (fis != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   399
                                        fis.close();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   400
                                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   401
                                } catch (IOException ioe) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   402
                                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   403
                            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   404
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   405
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   406
                        /* Here we get the fonts in jre/lib/fonts and register
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   407
                         * them so they are always available and preferred over
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   408
                         * other fonts. This needs to be registered before the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   409
                         * composite fonts as otherwise some native font that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   410
                         * corresponds may be found as we don't have a way to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   411
                         * handle two fonts of the same name, so the JRE one
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   412
                         * must be the first one registered. Pass "true" to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   413
                         * registerFonts method as on-screen these JRE fonts
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   414
                         * always go through the T2K rasteriser.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   415
                         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   416
                        if (FontUtilities.isLinux) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   417
                            /* Linux font configuration uses these fonts */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   418
                            registerFontDir(jreFontDirName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   419
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   420
                        registerFontsInDir(jreFontDirName, true, Font2D.JRE_RANK,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   421
                                           true, false);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   422
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   423
                        /* Create the font configuration and get any font path
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   424
                         * that might be specified.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   425
                         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   426
                        fontConfig = createFontConfiguration();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   427
                        if (isOpenJDK()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   428
                            String[] fontInfo = getDefaultPlatformFont();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   429
                            defaultFontName = fontInfo[0];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   430
                            defaultFontFileName = fontInfo[1];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   431
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   432
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   433
                        String extraFontPath = fontConfig.getExtraFontPath();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   434
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   435
                        /* In prior releases the debugging font path replaced
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   436
                         * all normally located font directories except for the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   437
                         * JRE fonts dir. This directory is still always located
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   438
                         * and placed at the head of the path but as an
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   439
                         * augmentation to the previous behaviour the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   440
                         * changes below allow you to additionally append to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   441
                         * the font path by starting with append: or prepend by
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   442
                         * starting with a prepend: sign. Eg: to append
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   443
                         * -Dsun.java2d.fontpath=append:/usr/local/myfonts
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   444
                         * and to prepend
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   445
                         * -Dsun.java2d.fontpath=prepend:/usr/local/myfonts Disp
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   446
                         *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   447
                         * If there is an appendedfontpath it in the font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   448
                         * configuration it is used instead of searching the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   449
                         * system for dirs.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   450
                         * The behaviour of append and prepend is then similar
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   451
                         * to the normal case. ie it goes after what
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   452
                         * you prepend and * before what you append. If the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   453
                         * sun.java2d.fontpath property is used, but it
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   454
                         * neither the append or prepend syntaxes is used then
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   455
                         * as except for the JRE dir the path is replaced and it
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   456
                         * is up to you to make sure that all the right
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   457
                         * directories are located. This is platform and
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   458
                         * locale-specific so its almost impossible to get
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   459
                         * right, so it should be used with caution.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   460
                         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   461
                        boolean prependToPath = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   462
                        boolean appendToPath = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   463
                        String dbgFontPath =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   464
                            System.getProperty("sun.java2d.fontpath");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   465
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   466
                        if (dbgFontPath != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   467
                            if (dbgFontPath.startsWith("prepend:")) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   468
                                prependToPath = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   469
                                dbgFontPath =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   470
                                    dbgFontPath.substring("prepend:".length());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   471
                            } else if (dbgFontPath.startsWith("append:")) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   472
                                appendToPath = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   473
                                dbgFontPath =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   474
                                    dbgFontPath.substring("append:".length());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   475
                            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   476
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   477
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   478
                        if (FontUtilities.debugFonts()) {
3938
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 3929
diff changeset
   479
                            PlatformLogger logger = FontUtilities.getLogger();
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   480
                            logger.info("JRE font directory: " + jreFontDirName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   481
                            logger.info("Extra font path: " + extraFontPath);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   482
                            logger.info("Debug font path: " + dbgFontPath);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   483
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   484
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   485
                        if (dbgFontPath != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   486
                            /* In debugging mode we register all the paths
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   487
                             * Caution: this is a very expensive call on Solaris:-
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   488
                             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   489
                            fontPath = getPlatformFontPath(noType1Font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   490
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   491
                            if (extraFontPath != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   492
                                fontPath =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   493
                                    extraFontPath + File.pathSeparator + fontPath;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   494
                            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   495
                            if (appendToPath) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   496
                                fontPath =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   497
                                    fontPath + File.pathSeparator + dbgFontPath;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   498
                            } else if (prependToPath) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   499
                                fontPath =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   500
                                    dbgFontPath + File.pathSeparator + fontPath;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   501
                            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   502
                                fontPath = dbgFontPath;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   503
                            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   504
                            registerFontDirs(fontPath);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   505
                        } else if (extraFontPath != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   506
                            /* If the font configuration contains an
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   507
                             * "appendedfontpath" entry, it is interpreted as a
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   508
                             * set of locations that should always be registered.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   509
                             * It may be additional to locations normally found
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   510
                             * for that place, or it may be locations that need
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   511
                             * to have all their paths registered to locate all
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   512
                             * the needed platform names.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   513
                             * This is typically when the same .TTF file is
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   514
                             * referenced from multiple font.dir files and all
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   515
                             * of these must be read to find all the native
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   516
                             * (XLFD) names for the font, so that X11 font APIs
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   517
                             * can be used for as many code points as possible.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   518
                             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   519
                            registerFontDirs(extraFontPath);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   520
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   521
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   522
                        /* On Solaris, we need to register the Japanese TrueType
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   523
                         * directory so that we can find the corresponding
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   524
                         * bitmap fonts. This could be done by listing the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   525
                         * directory in the font configuration file, but we
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   526
                         * don't want to confuse users with this quirk. There
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   527
                         * are no bitmap fonts for other writing systems that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   528
                         * correspond to TrueType fonts and have matching XLFDs.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   529
                         * We need to register the bitmap fonts only in
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   530
                         * environments where they're on the X font path, i.e.,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   531
                         * in the Japanese locale. Note that if the X Toolkit
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   532
                         * is in use the font path isn't set up by JDK, but
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   533
                         * users of a JA locale should have it
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   534
                         * set up already by their login environment.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   535
                         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   536
                        if (FontUtilities.isSolaris && Locale.JAPAN.equals(Locale.getDefault())) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   537
                            registerFontDir("/usr/openwin/lib/locale/ja/X11/fonts/TT");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   538
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   539
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   540
                        initCompositeFonts(fontConfig, null);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   541
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   542
                        return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   543
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   544
                });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   545
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   546
        boolean platformFont = AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   547
                        new PrivilegedAction<Boolean>() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   548
                                public Boolean run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   549
                                        String prop =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   550
                                                System.getProperty("java2d.font.usePlatformFont");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   551
                                        String env = System.getenv("JAVA2D_USEPLATFORMFONT");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   552
                                        return "true".equals(prop) || env != null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   553
                                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   554
                        });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   555
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   556
        if (platformFont) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   557
            usePlatformFontMetrics = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   558
            System.out.println("Enabling platform font metrics for win32. This is an unsupported option.");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   559
            System.out.println("This yields incorrect composite font metrics as reported by 1.1.x releases.");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   560
            System.out.println("It is appropriate only for use by applications which do not use any Java 2");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   561
            System.out.println("functionality. This property will be removed in a later release.");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   562
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   563
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   564
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   565
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   566
     * This method is provided for internal and exclusive use by Swing.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   567
     *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   568
     * @param font representing a physical font.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   569
     * @return true if the underlying font is a TrueType or OpenType font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   570
     * that claims to support the Microsoft Windows encoding corresponding to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   571
     * the default file.encoding property of this JRE instance.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   572
     * This narrow value is useful for Swing to decide if the font is useful
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   573
     * for the the Windows Look and Feel, or, if a  composite font should be
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   574
     * used instead.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   575
     * The information used to make the decision is obtained from
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   576
     * the ulCodePageRange fields in the font.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   577
     * A caller can use isLogicalFont(Font) in this class before calling
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   578
     * this method and would not need to call this method if that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   579
     * returns true.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   580
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   581
//     static boolean fontSupportsDefaultEncoding(Font font) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   582
//      String encoding =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   583
//          (String) java.security.AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   584
//                new sun.security.action.GetPropertyAction("file.encoding"));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   585
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   586
//      if (encoding == null || font == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   587
//          return false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   588
//      }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   589
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   590
//      encoding = encoding.toLowerCase(Locale.ENGLISH);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   591
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   592
//      return FontManager.fontSupportsEncoding(font, encoding);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   593
//     }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   594
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   595
    public Font2DHandle getNewComposite(String family, int style,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   596
                                        Font2DHandle handle) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   597
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   598
        if (!(handle.font2D instanceof CompositeFont)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   599
            return handle;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   600
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   601
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   602
        CompositeFont oldComp = (CompositeFont)handle.font2D;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   603
        PhysicalFont oldFont = oldComp.getSlotFont(0);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   604
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   605
        if (family == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   606
            family = oldFont.getFamilyName(null);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   607
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   608
        if (style == -1) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   609
            style = oldComp.getStyle();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   610
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   611
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   612
        Font2D newFont = findFont2D(family, style, NO_FALLBACK);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   613
        if (!(newFont instanceof PhysicalFont)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   614
            newFont = oldFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   615
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   616
        PhysicalFont physicalFont = (PhysicalFont)newFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   617
        CompositeFont dialog2D =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   618
            (CompositeFont)findFont2D("dialog", style, NO_FALLBACK);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   619
        if (dialog2D == null) { /* shouldn't happen */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   620
            return handle;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   621
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   622
        CompositeFont compFont = new CompositeFont(physicalFont, dialog2D);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   623
        Font2DHandle newHandle = new Font2DHandle(compFont);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   624
        return newHandle;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   625
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   626
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   627
    protected void registerCompositeFont(String compositeName,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   628
                                      String[] componentFileNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   629
                                      String[] componentNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   630
                                      int numMetricsSlots,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   631
                                      int[] exclusionRanges,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   632
                                      int[] exclusionMaxIndex,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   633
                                      boolean defer) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   634
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   635
        CompositeFont cf = new CompositeFont(compositeName,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   636
                                             componentFileNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   637
                                             componentNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   638
                                             numMetricsSlots,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   639
                                             exclusionRanges,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   640
                                             exclusionMaxIndex, defer, this);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   641
        addCompositeToFontList(cf, Font2D.FONT_CONFIG_RANK);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   642
        synchronized (compFonts) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   643
            compFonts[maxCompFont++] = cf;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   644
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   645
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   646
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   647
    /* This variant is used only when the application specifies
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   648
     * a variant of composite fonts which prefers locale specific or
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   649
     * proportional fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   650
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   651
    protected static void registerCompositeFont(String compositeName,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   652
                                                String[] componentFileNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   653
                                                String[] componentNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   654
                                                int numMetricsSlots,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   655
                                                int[] exclusionRanges,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   656
                                                int[] exclusionMaxIndex,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   657
                                                boolean defer,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   658
                                                ConcurrentHashMap<String, Font2D>
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   659
                                                altNameCache) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   660
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   661
        CompositeFont cf = new CompositeFont(compositeName,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   662
                                             componentFileNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   663
                                             componentNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   664
                                             numMetricsSlots,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   665
                                             exclusionRanges,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   666
                                             exclusionMaxIndex, defer,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   667
                                             SunFontManager.getInstance());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   668
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   669
        /* if the cache has an existing composite for this case, make
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   670
         * its handle point to this new font.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   671
         * This ensures that when the altNameCache that is passed in
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   672
         * is the global mapNameCache - ie we are running as an application -
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   673
         * that any statically created java.awt.Font instances which already
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   674
         * have a Font2D instance will have that re-directed to the new Font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   675
         * on subsequent uses. This is particularly important for "the"
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   676
         * default font instance, or similar cases where a UI toolkit (eg
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   677
         * Swing) has cached a java.awt.Font. Note that if Swing is using
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   678
         * a custom composite APIs which update the standard composites have
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   679
         * no effect - this is typically the case only when using the Windows
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   680
         * L&F where these APIs would conflict with that L&F anyway.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   681
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   682
        Font2D oldFont = (Font2D)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   683
            altNameCache.get(compositeName.toLowerCase(Locale.ENGLISH));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   684
        if (oldFont instanceof CompositeFont) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   685
            oldFont.handle.font2D = cf;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   686
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   687
        altNameCache.put(compositeName.toLowerCase(Locale.ENGLISH), cf);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   688
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   689
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   690
    private void addCompositeToFontList(CompositeFont f, int rank) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   691
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   692
        if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   693
            FontUtilities.getLogger().info("Add to Family "+ f.familyName +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   694
                        ", Font " + f.fullName + " rank="+rank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   695
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   696
        f.setRank(rank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   697
        compositeFonts.put(f.fullName, f);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   698
        fullNameToFont.put(f.fullName.toLowerCase(Locale.ENGLISH), f);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   699
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   700
        FontFamily family = FontFamily.getFamily(f.familyName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   701
        if (family == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   702
            family = new FontFamily(f.familyName, true, rank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   703
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   704
        family.setFont(f, f.style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   705
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   706
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   707
    /*
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   708
     * Systems may have fonts with the same name.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   709
     * We want to register only one of such fonts (at least until
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   710
     * such time as there might be APIs which can accommodate > 1).
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   711
     * Rank is 1) font configuration fonts, 2) JRE fonts, 3) OT/TT fonts,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   712
     * 4) Type1 fonts, 5) native fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   713
     *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   714
     * If the new font has the same name as the old font, the higher
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   715
     * ranked font gets added, replacing the lower ranked one.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   716
     * If the fonts are of equal rank, then make a special case of
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   717
     * font configuration rank fonts, which are on closer inspection,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   718
     * OT/TT fonts such that the larger font is registered. This is
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   719
     * a heuristic since a font may be "larger" in the sense of more
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   720
     * code points, or be a larger "file" because it has more bitmaps.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   721
     * So it is possible that using filesize may lead to less glyphs, and
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   722
     * using glyphs may lead to lower quality display. Probably number
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   723
     * of glyphs is the ideal, but filesize is information we already
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   724
     * have and is good enough for the known cases.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   725
     * Also don't want to register fonts that match JRE font families
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   726
     * but are coming from a source other than the JRE.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   727
     * This will ensure that we will algorithmically style the JRE
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   728
     * plain font and get the same set of glyphs for all styles.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   729
     *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   730
     * Note that this method returns a value
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   731
     * if it returns the same object as its argument that means this
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   732
     * font was newly registered.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   733
     * If it returns a different object it means this font already exists,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   734
     * and you should use that one.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   735
     * If it returns null means this font was not registered and none
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   736
     * in that name is registered. The caller must find a substitute
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   737
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   738
    private PhysicalFont addToFontList(PhysicalFont f, int rank) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   739
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   740
        String fontName = f.fullName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   741
        String familyName = f.familyName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   742
        if (fontName == null || "".equals(fontName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   743
            return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   744
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   745
        if (compositeFonts.containsKey(fontName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   746
            /* Don't register any font that has the same name as a composite */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   747
            return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   748
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   749
        f.setRank(rank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   750
        if (!physicalFonts.containsKey(fontName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   751
            if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   752
                FontUtilities.getLogger().info("Add to Family "+familyName +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   753
                            ", Font " + fontName + " rank="+rank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   754
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   755
            physicalFonts.put(fontName, f);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   756
            FontFamily family = FontFamily.getFamily(familyName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   757
            if (family == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   758
                family = new FontFamily(familyName, false, rank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   759
                family.setFont(f, f.style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   760
            } else if (family.getRank() >= rank) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   761
                family.setFont(f, f.style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   762
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   763
            fullNameToFont.put(fontName.toLowerCase(Locale.ENGLISH), f);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   764
            return f;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   765
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   766
            PhysicalFont newFont = f;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   767
            PhysicalFont oldFont = physicalFonts.get(fontName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   768
            if (oldFont == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   769
                return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   770
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   771
            /* If the new font is of an equal or higher rank, it is a
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   772
             * candidate to replace the current one, subject to further tests.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   773
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   774
            if (oldFont.getRank() >= rank) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   775
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   776
                /* All fonts initialise their mapper when first
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   777
                 * used. If the mapper is non-null then this font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   778
                 * has been accessed at least once. In that case
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   779
                 * do not replace it. This may be overly stringent,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   780
                 * but its probably better not to replace a font that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   781
                 * someone is already using without a compelling reason.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   782
                 * Additionally the primary case where it is known
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   783
                 * this behaviour is important is in certain composite
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   784
                 * fonts, and since all the components of a given
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   785
                 * composite are usually initialised together this
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   786
                 * is unlikely. For this to be a problem, there would
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   787
                 * have to be a case where two different composites used
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   788
                 * different versions of the same-named font, and they
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   789
                 * were initialised and used at separate times.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   790
                 * In that case we continue on and allow the new font to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   791
                 * be installed, but replaceFont will continue to allow
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   792
                 * the original font to be used in Composite fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   793
                 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   794
                if (oldFont.mapper != null && rank > Font2D.FONT_CONFIG_RANK) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   795
                    return oldFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   796
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   797
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   798
                /* Normally we require a higher rank to replace a font,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   799
                 * but as a special case, if the two fonts are the same rank,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   800
                 * and are instances of TrueTypeFont we want the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   801
                 * more complete (larger) one.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   802
                 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   803
                if (oldFont.getRank() == rank) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   804
                    if (oldFont instanceof TrueTypeFont &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   805
                        newFont instanceof TrueTypeFont) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   806
                        TrueTypeFont oldTTFont = (TrueTypeFont)oldFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   807
                        TrueTypeFont newTTFont = (TrueTypeFont)newFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   808
                        if (oldTTFont.fileSize >= newTTFont.fileSize) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   809
                            return oldFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   810
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   811
                    } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   812
                        return oldFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   813
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   814
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   815
                /* Don't replace ever JRE fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   816
                 * This test is in case a font configuration references
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   817
                 * a Lucida font, which has been mapped to a Lucida
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   818
                 * from the host O/S. The assumption here is that any
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   819
                 * such font configuration file is probably incorrect, or
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   820
                 * the host O/S version is for the use of AWT.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   821
                 * In other words if we reach here, there's a possible
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   822
                 * problem with our choice of font configuration fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   823
                 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   824
                if (oldFont.platName.startsWith(jreFontDirName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   825
                    if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   826
                        FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   827
                              .warning("Unexpected attempt to replace a JRE " +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   828
                                       " font " + fontName + " from " +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   829
                                        oldFont.platName +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   830
                                       " with " + newFont.platName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   831
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   832
                    return oldFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   833
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   834
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   835
                if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   836
                    FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   837
                          .info("Replace in Family " + familyName +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   838
                                ",Font " + fontName + " new rank="+rank +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   839
                                " from " + oldFont.platName +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   840
                                " with " + newFont.platName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   841
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   842
                replaceFont(oldFont, newFont);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   843
                physicalFonts.put(fontName, newFont);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   844
                fullNameToFont.put(fontName.toLowerCase(Locale.ENGLISH),
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   845
                                   newFont);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   846
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   847
                FontFamily family = FontFamily.getFamily(familyName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   848
                if (family == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   849
                    family = new FontFamily(familyName, false, rank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   850
                    family.setFont(newFont, newFont.style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   851
                } else if (family.getRank() >= rank) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   852
                    family.setFont(newFont, newFont.style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   853
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   854
                return newFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   855
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   856
                return oldFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   857
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   858
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   859
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   860
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   861
    public Font2D[] getRegisteredFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   862
        PhysicalFont[] physFonts = getPhysicalFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   863
        int mcf = maxCompFont; /* for MT-safety */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   864
        Font2D[] regFonts = new Font2D[physFonts.length+mcf];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   865
        System.arraycopy(compFonts, 0, regFonts, 0, mcf);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   866
        System.arraycopy(physFonts, 0, regFonts, mcf, physFonts.length);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   867
        return regFonts;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   868
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   869
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   870
    protected PhysicalFont[] getPhysicalFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   871
        return physicalFonts.values().toArray(new PhysicalFont[0]);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   872
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   873
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   874
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   875
    /* The class FontRegistrationInfo is used when a client says not
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   876
     * to register a font immediately. This mechanism is used to defer
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   877
     * initialisation of all the components of composite fonts at JRE
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   878
     * start-up. The CompositeFont class is "aware" of this and when it
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   879
     * is first used it asks for the registration of its components.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   880
     * Also in the event that any physical font is requested the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   881
     * deferred fonts are initialised before triggering a search of the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   882
     * system.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   883
     * Two maps are used. One to track the deferred fonts. The
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   884
     * other to track the fonts that have been initialised through this
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   885
     * mechanism.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   886
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   887
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   888
    private static final class FontRegistrationInfo {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   889
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   890
        String fontFilePath;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   891
        String[] nativeNames;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   892
        int fontFormat;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   893
        boolean javaRasterizer;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   894
        int fontRank;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   895
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   896
        FontRegistrationInfo(String fontPath, String[] names, int format,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   897
                             boolean useJavaRasterizer, int rank) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   898
            this.fontFilePath = fontPath;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   899
            this.nativeNames = names;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   900
            this.fontFormat = format;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   901
            this.javaRasterizer = useJavaRasterizer;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   902
            this.fontRank = rank;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   903
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   904
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   905
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   906
    private final ConcurrentHashMap<String, FontRegistrationInfo>
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   907
        deferredFontFiles =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   908
        new ConcurrentHashMap<String, FontRegistrationInfo>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   909
    private final ConcurrentHashMap<String, Font2DHandle>
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   910
        initialisedFonts = new ConcurrentHashMap<String, Font2DHandle>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   911
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   912
    /* Remind: possibly enhance initialiseDeferredFonts() to be
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   913
     * optionally given a name and a style and it could stop when it
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   914
     * finds that font - but this would be a problem if two of the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   915
     * fonts reference the same font face name (cf the Solaris
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   916
     * euro fonts).
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   917
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   918
    protected synchronized void initialiseDeferredFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   919
        for (String fileName : deferredFontFiles.keySet()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   920
            initialiseDeferredFont(fileName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   921
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   922
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   923
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   924
    protected synchronized void registerDeferredJREFonts(String jreDir) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   925
        for (FontRegistrationInfo info : deferredFontFiles.values()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   926
            if (info.fontFilePath != null &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   927
                info.fontFilePath.startsWith(jreDir)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   928
                initialiseDeferredFont(info.fontFilePath);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   929
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   930
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   931
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   932
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   933
    public boolean isDeferredFont(String fileName) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   934
        return deferredFontFiles.containsKey(fileName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   935
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   936
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   937
    /* We keep a map of the files which contain the Lucida fonts so we
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   938
     * don't need to search for them.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   939
     * But since we know what fonts these files contain, we can also avoid
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   940
     * opening them to look for a font name we don't recognise - see
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   941
     * findDeferredFont().
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   942
     * For typical cases where the font isn't a JRE one the overhead is
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   943
     * this method call, HashMap.get() and null reference test, then
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   944
     * a boolean test of noOtherJREFontFiles.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   945
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   946
    public
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   947
    /*private*/ PhysicalFont findJREDeferredFont(String name, int style) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   948
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   949
        PhysicalFont physicalFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   950
        String nameAndStyle = name.toLowerCase(Locale.ENGLISH) + style;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   951
        String fileName = jreFontMap.get(nameAndStyle);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   952
        if (fileName != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   953
            fileName = jreFontDirName + File.separator + fileName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   954
            if (deferredFontFiles.get(fileName) != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   955
                physicalFont = initialiseDeferredFont(fileName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   956
                if (physicalFont != null &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   957
                    (physicalFont.getFontName(null).equalsIgnoreCase(name) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   958
                     physicalFont.getFamilyName(null).equalsIgnoreCase(name))
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   959
                    && physicalFont.style == style) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   960
                    return physicalFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   961
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   962
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   963
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   964
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   965
        /* Iterate over the deferred font files looking for any in the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   966
         * jre directory that we didn't recognise, open each of these.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   967
         * In almost all installations this will quickly fall through
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   968
         * because only the Lucidas will be present and jreOtherFontFiles
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   969
         * will be empty.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   970
         * noOtherJREFontFiles is used so we can skip this block as soon
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   971
         * as its determined that its not needed - almost always after the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   972
         * very first time through.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   973
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   974
        if (noOtherJREFontFiles) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   975
            return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   976
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   977
        synchronized (jreLucidaFontFiles) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   978
            if (jreOtherFontFiles == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   979
                HashSet<String> otherFontFiles = new HashSet<String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   980
                for (String deferredFile : deferredFontFiles.keySet()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   981
                    File file = new File(deferredFile);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   982
                    String dir = file.getParent();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   983
                    String fname = file.getName();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   984
                    /* skip names which aren't absolute, aren't in the JRE
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   985
                     * directory, or are known Lucida fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   986
                     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   987
                    if (dir == null ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   988
                        !dir.equals(jreFontDirName) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   989
                        jreLucidaFontFiles.contains(fname)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   990
                        continue;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   991
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   992
                    otherFontFiles.add(deferredFile);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   993
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   994
                jreOtherFontFiles = otherFontFiles.toArray(STR_ARRAY);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   995
                if (jreOtherFontFiles.length == 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   996
                    noOtherJREFontFiles = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   997
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   998
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
   999
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1000
            for (int i=0; i<jreOtherFontFiles.length;i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1001
                fileName = jreOtherFontFiles[i];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1002
                if (fileName == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1003
                    continue;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1004
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1005
                jreOtherFontFiles[i] = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1006
                physicalFont = initialiseDeferredFont(fileName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1007
                if (physicalFont != null &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1008
                    (physicalFont.getFontName(null).equalsIgnoreCase(name) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1009
                     physicalFont.getFamilyName(null).equalsIgnoreCase(name))
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1010
                    && physicalFont.style == style) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1011
                    return physicalFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1012
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1013
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1014
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1015
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1016
        return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1017
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1018
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1019
    /* This skips JRE installed fonts. */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1020
    private PhysicalFont findOtherDeferredFont(String name, int style) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1021
        for (String fileName : deferredFontFiles.keySet()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1022
            File file = new File(fileName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1023
            String dir = file.getParent();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1024
            String fname = file.getName();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1025
            if (dir != null &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1026
                dir.equals(jreFontDirName) &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1027
                jreLucidaFontFiles.contains(fname)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1028
                continue;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1029
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1030
            PhysicalFont physicalFont = initialiseDeferredFont(fileName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1031
            if (physicalFont != null &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1032
                (physicalFont.getFontName(null).equalsIgnoreCase(name) ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1033
                physicalFont.getFamilyName(null).equalsIgnoreCase(name)) &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1034
                physicalFont.style == style) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1035
                return physicalFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1036
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1037
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1038
        return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1039
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1040
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1041
    private PhysicalFont findDeferredFont(String name, int style) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1042
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1043
        PhysicalFont physicalFont = findJREDeferredFont(name, style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1044
        if (physicalFont != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1045
            return physicalFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1046
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1047
            return findOtherDeferredFont(name, style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1048
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1049
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1050
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1051
    public void registerDeferredFont(String fileNameKey,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1052
                                     String fullPathName,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1053
                                     String[] nativeNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1054
                                     int fontFormat,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1055
                                     boolean useJavaRasterizer,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1056
                                     int fontRank) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1057
        FontRegistrationInfo regInfo =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1058
            new FontRegistrationInfo(fullPathName, nativeNames, fontFormat,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1059
                                     useJavaRasterizer, fontRank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1060
        deferredFontFiles.put(fileNameKey, regInfo);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1061
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1062
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1063
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1064
    public synchronized
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1065
         PhysicalFont initialiseDeferredFont(String fileNameKey) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1066
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1067
        if (fileNameKey == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1068
            return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1069
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1070
        if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1071
            FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1072
                            .info("Opening deferred font file " + fileNameKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1073
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1074
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1075
        PhysicalFont physicalFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1076
        FontRegistrationInfo regInfo = deferredFontFiles.get(fileNameKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1077
        if (regInfo != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1078
            deferredFontFiles.remove(fileNameKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1079
            physicalFont = registerFontFile(regInfo.fontFilePath,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1080
                                            regInfo.nativeNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1081
                                            regInfo.fontFormat,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1082
                                            regInfo.javaRasterizer,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1083
                                            regInfo.fontRank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1084
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1085
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1086
            if (physicalFont != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1087
                /* Store the handle, so that if a font is bad, we
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1088
                 * retrieve the substituted font.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1089
                 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1090
                initialisedFonts.put(fileNameKey, physicalFont.handle);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1091
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1092
                initialisedFonts.put(fileNameKey,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1093
                                     getDefaultPhysicalFont().handle);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1094
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1095
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1096
            Font2DHandle handle = initialisedFonts.get(fileNameKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1097
            if (handle == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1098
                /* Probably shouldn't happen, but just in case */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1099
                physicalFont = getDefaultPhysicalFont();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1100
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1101
                physicalFont = (PhysicalFont)(handle.font2D);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1102
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1103
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1104
        return physicalFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1105
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1106
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1107
    public boolean isRegisteredFontFile(String name) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1108
        return registeredFonts.containsKey(name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1109
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1110
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1111
    public PhysicalFont getRegisteredFontFile(String name) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1112
        return registeredFonts.get(name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1113
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1114
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1115
    /* Note that the return value from this method is not always
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1116
     * derived from this file, and may be null. See addToFontList for
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1117
     * some explanation of this.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1118
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1119
    public PhysicalFont registerFontFile(String fileName,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1120
                                         String[] nativeNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1121
                                         int fontFormat,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1122
                                         boolean useJavaRasterizer,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1123
                                         int fontRank) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1124
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1125
        PhysicalFont regFont = registeredFonts.get(fileName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1126
        if (regFont != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1127
            return regFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1128
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1129
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1130
        PhysicalFont physicalFont = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1131
        try {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1132
            String name;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1133
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1134
            switch (fontFormat) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1135
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1136
            case FONTFORMAT_TRUETYPE:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1137
                int fn = 0;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1138
                TrueTypeFont ttf;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1139
                do {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1140
                    ttf = new TrueTypeFont(fileName, nativeNames, fn++,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1141
                                           useJavaRasterizer);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1142
                    PhysicalFont pf = addToFontList(ttf, fontRank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1143
                    if (physicalFont == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1144
                        physicalFont = pf;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1145
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1146
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1147
                while (fn < ttf.getFontCount());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1148
                break;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1149
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1150
            case FONTFORMAT_TYPE1:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1151
                Type1Font t1f = new Type1Font(fileName, nativeNames);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1152
                physicalFont = addToFontList(t1f, fontRank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1153
                break;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1154
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1155
            case FONTFORMAT_NATIVE:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1156
                NativeFont nf = new NativeFont(fileName, false);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1157
                physicalFont = addToFontList(nf, fontRank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1158
            default:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1159
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1160
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1161
            if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1162
                FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1163
                      .info("Registered file " + fileName + " as font " +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1164
                            physicalFont + " rank="  + fontRank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1165
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1166
        } catch (FontFormatException ffe) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1167
            if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1168
                FontUtilities.getLogger().warning("Unusable font: " +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1169
                               fileName + " " + ffe.toString());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1170
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1171
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1172
        if (physicalFont != null &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1173
            fontFormat != FONTFORMAT_NATIVE) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1174
            registeredFonts.put(fileName, physicalFont);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1175
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1176
        return physicalFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1177
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1178
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1179
    public void registerFonts(String[] fileNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1180
                              String[][] nativeNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1181
                              int fontCount,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1182
                              int fontFormat,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1183
                              boolean useJavaRasterizer,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1184
                              int fontRank, boolean defer) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1185
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1186
        for (int i=0; i < fontCount; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1187
            if (defer) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1188
                registerDeferredFont(fileNames[i],fileNames[i], nativeNames[i],
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1189
                                     fontFormat, useJavaRasterizer, fontRank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1190
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1191
                registerFontFile(fileNames[i], nativeNames[i],
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1192
                                 fontFormat, useJavaRasterizer, fontRank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1193
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1194
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1195
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1196
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1197
    /*
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1198
     * This is the Physical font used when some other font on the system
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1199
     * can't be located. There has to be at least one font or the font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1200
     * system is not useful and the graphics environment cannot sustain
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1201
     * the Java platform.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1202
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1203
    public PhysicalFont getDefaultPhysicalFont() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1204
        if (defaultPhysicalFont == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1205
            /* findFont2D will load all fonts before giving up the search.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1206
             * If the JRE Lucida isn't found (eg because the JRE fonts
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1207
             * directory is missing), it could find another version of Lucida
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1208
             * from the host system. This is OK because at that point we are
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1209
             * trying to gracefully handle/recover from a system
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1210
             * misconfiguration and this is probably a reasonable substitution.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1211
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1212
            defaultPhysicalFont = (PhysicalFont)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1213
                findFont2D("Lucida Sans Regular", Font.PLAIN, NO_FALLBACK);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1214
            if (defaultPhysicalFont == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1215
                defaultPhysicalFont = (PhysicalFont)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1216
                    findFont2D("Arial", Font.PLAIN, NO_FALLBACK);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1217
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1218
            if (defaultPhysicalFont == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1219
                /* Because of the findFont2D call above, if we reach here, we
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1220
                 * know all fonts have already been loaded, just accept any
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1221
                 * match at this point. If this fails we are in real trouble
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1222
                 * and I don't know how to recover from there being absolutely
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1223
                 * no fonts anywhere on the system.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1224
                 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1225
                Iterator i = physicalFonts.values().iterator();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1226
                if (i.hasNext()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1227
                    defaultPhysicalFont = (PhysicalFont)i.next();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1228
                } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1229
                    throw new Error("Probable fatal error:No fonts found.");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1230
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1231
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1232
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1233
        return defaultPhysicalFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1234
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1235
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1236
    public CompositeFont getDefaultLogicalFont(int style) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1237
        return (CompositeFont)findFont2D("dialog", style, NO_FALLBACK);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1238
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1239
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1240
    /*
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1241
     * return String representation of style prepended with "."
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1242
     * This is useful for performance to avoid unnecessary string operations.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1243
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1244
    private static String dotStyleStr(int num) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1245
        switch(num){
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1246
          case Font.BOLD:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1247
            return ".bold";
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1248
          case Font.ITALIC:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1249
            return ".italic";
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1250
          case Font.ITALIC | Font.BOLD:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1251
            return ".bolditalic";
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1252
          default:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1253
            return ".plain";
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1254
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1255
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1256
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1257
    /* This is implemented only on windows and is called from code that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1258
     * executes only on windows. This isn't pretty but its not a precedent
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1259
     * in this file. This very probably should be cleaned up at some point.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1260
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1261
    protected void
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1262
        populateFontFileNameMap(HashMap<String,String> fontToFileMap,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1263
                                HashMap<String,String> fontToFamilyNameMap,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1264
                                HashMap<String,ArrayList<String>>
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1265
                                familyToFontListMap,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1266
                                Locale locale) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1267
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1268
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1269
    /* Obtained from Platform APIs (windows only)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1270
     * Map from lower-case font full name to basename of font file.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1271
     * Eg "arial bold" -> ARIALBD.TTF.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1272
     * For TTC files, there is a mapping for each font in the file.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1273
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1274
    private HashMap<String,String> fontToFileMap = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1275
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1276
    /* Obtained from Platform APIs (windows only)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1277
     * Map from lower-case font full name to the name of its font family
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1278
     * Eg "arial bold" -> "Arial"
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1279
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1280
    private HashMap<String,String> fontToFamilyNameMap = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1281
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1282
    /* Obtained from Platform APIs (windows only)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1283
     * Map from a lower-case family name to a list of full names of
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1284
     * the member fonts, eg:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1285
     * "arial" -> ["Arial", "Arial Bold", "Arial Italic","Arial Bold Italic"]
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1286
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1287
    private HashMap<String,ArrayList<String>> familyToFontListMap= null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1288
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1289
    /* The directories which contain platform fonts */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1290
    private String[] pathDirs = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1291
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1292
    private boolean haveCheckedUnreferencedFontFiles;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1293
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1294
    private String[] getFontFilesFromPath(boolean noType1) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1295
        final FilenameFilter filter;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1296
        if (noType1) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1297
            filter = ttFilter;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1298
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1299
            filter = new TTorT1Filter();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1300
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1301
        return (String[])AccessController.doPrivileged(new PrivilegedAction() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1302
            public Object run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1303
                if (pathDirs.length == 1) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1304
                    File dir = new File(pathDirs[0]);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1305
                    String[] files = dir.list(filter);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1306
                    if (files == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1307
                        return new String[0];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1308
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1309
                    for (int f=0; f<files.length; f++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1310
                        files[f] = files[f].toLowerCase();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1311
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1312
                    return files;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1313
                } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1314
                    ArrayList<String> fileList = new ArrayList<String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1315
                    for (int i = 0; i< pathDirs.length; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1316
                        File dir = new File(pathDirs[i]);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1317
                        String[] files = dir.list(filter);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1318
                        if (files == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1319
                            continue;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1320
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1321
                        for (int f=0; f<files.length ; f++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1322
                            fileList.add(files[f].toLowerCase());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1323
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1324
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1325
                    return fileList.toArray(STR_ARRAY);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1326
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1327
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1328
        });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1329
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1330
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1331
    /* This is needed since some windows registry names don't match
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1332
     * the font names.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1333
     * - UPC styled font names have a double space, but the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1334
     * registry entry mapping to a file doesn't.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1335
     * - Marlett is in a hidden file not listed in the registry
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1336
     * - The registry advertises that the file david.ttf contains a
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1337
     * font with the full name "David Regular" when in fact its
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1338
     * just "David".
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1339
     * Directly fix up these known cases as this is faster.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1340
     * If a font which doesn't match these known cases has no file,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1341
     * it may be a font that has been temporarily added to the known set
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1342
     * or it may be an installed font with a missing registry entry.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1343
     * Installed fonts are those in the windows font directories.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1344
     * Make a best effort attempt to locate these.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1345
     * We obtain the list of TrueType fonts in these directories and
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1346
     * filter out all the font files we already know about from the registry.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1347
     * What remains may be "bad" fonts, duplicate fonts, or perhaps the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1348
     * missing font(s) we are looking for.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1349
     * Open each of these files to find out.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1350
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1351
    private void resolveWindowsFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1352
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1353
        ArrayList<String> unmappedFontNames = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1354
        for (String font : fontToFamilyNameMap.keySet()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1355
            String file = fontToFileMap.get(font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1356
            if (file == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1357
                if (font.indexOf("  ") > 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1358
                    String newName = font.replaceFirst("  ", " ");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1359
                    file = fontToFileMap.get(newName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1360
                    /* If this name exists and isn't for a valid name
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1361
                     * replace the mapping to the file with this font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1362
                     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1363
                    if (file != null &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1364
                        !fontToFamilyNameMap.containsKey(newName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1365
                        fontToFileMap.remove(newName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1366
                        fontToFileMap.put(font, file);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1367
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1368
                } else if (font.equals("marlett")) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1369
                    fontToFileMap.put(font, "marlett.ttf");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1370
                } else if (font.equals("david")) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1371
                    file = fontToFileMap.get("david regular");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1372
                    if (file != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1373
                        fontToFileMap.remove("david regular");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1374
                        fontToFileMap.put("david", file);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1375
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1376
                } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1377
                    if (unmappedFontNames == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1378
                        unmappedFontNames = new ArrayList<String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1379
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1380
                    unmappedFontNames.add(font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1381
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1382
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1383
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1384
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1385
        if (unmappedFontNames != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1386
            HashSet<String> unmappedFontFiles = new HashSet<String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1387
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1388
            /* Every font key in fontToFileMap ought to correspond to a
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1389
             * font key in fontToFamilyNameMap. Entries that don't seem
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1390
             * to correspond are likely fonts that were named differently
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1391
             * by GDI than in the registry. One known cause of this is when
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1392
             * Windows has had its regional settings changed so that from
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1393
             * GDI we get a localised (eg Chinese or Japanese) name for the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1394
             * font, but the registry retains the English version of the name
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1395
             * that corresponded to the "install" locale for windows.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1396
             * Since we are in this code block because there are unmapped
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1397
             * font names, we can look to find unused font->file mappings
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1398
             * and then open the files to read the names. We don't generally
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1399
             * want to open font files, as its a performance hit, but this
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1400
             * occurs only for a small number of fonts on specific system
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1401
             * configs - ie is believed that a "true" Japanese windows would
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1402
             * have JA names in the registry too.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1403
             * Clone fontToFileMap and remove from the clone all keys which
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1404
             * match a fontToFamilyNameMap key. What remains maps to the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1405
             * files we want to open to find the fonts GDI returned.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1406
             * A font in such a file is added to the fontToFileMap after
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1407
             * checking its one of the unmappedFontNames we are looking for.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1408
             * The original name that didn't map is removed from fontToFileMap
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1409
             * so essentially this "fixes up" fontToFileMap to use the same
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1410
             * name as GDI.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1411
             * Also note that typically the fonts for which this occurs in
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1412
             * CJK locales are TTC fonts and not all fonts in a TTC may have
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1413
             * localised names. Eg MSGOTHIC.TTC contains 3 fonts and one of
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1414
             * them "MS UI Gothic" has no JA name whereas the other two do.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1415
             * So not every font in these files is unmapped or new.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1416
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1417
            HashMap<String,String> ffmapCopy =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1418
                (HashMap<String,String>)(fontToFileMap.clone());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1419
            for (String key : fontToFamilyNameMap.keySet()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1420
                ffmapCopy.remove(key);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1421
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1422
            for (String key : ffmapCopy.keySet()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1423
                unmappedFontFiles.add(ffmapCopy.get(key));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1424
                fontToFileMap.remove(key);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1425
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1426
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1427
            resolveFontFiles(unmappedFontFiles, unmappedFontNames);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1428
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1429
            /* If there are still unmapped font names, this means there's
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1430
             * something that wasn't in the registry. We need to get all
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1431
             * the font files directly and look at the ones that weren't
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1432
             * found in the registry.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1433
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1434
            if (unmappedFontNames.size() > 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1435
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1436
                /* getFontFilesFromPath() returns all lower case names.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1437
                 * To compare we also need lower case
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1438
                 * versions of the names from the registry.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1439
                 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1440
                ArrayList<String> registryFiles = new ArrayList<String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1441
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1442
                for (String regFile : fontToFileMap.values()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1443
                    registryFiles.add(regFile.toLowerCase());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1444
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1445
                /* We don't look for Type1 files here as windows will
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1446
                 * not enumerate these, so aren't useful in reconciling
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1447
                 * GDI's unmapped files. We do find these later when
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1448
                 * we enumerate all fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1449
                 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1450
                for (String pathFile : getFontFilesFromPath(true)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1451
                    if (!registryFiles.contains(pathFile)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1452
                        unmappedFontFiles.add(pathFile);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1453
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1454
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1455
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1456
                resolveFontFiles(unmappedFontFiles, unmappedFontNames);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1457
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1458
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1459
            /* remove from the set of names that will be returned to the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1460
             * user any fonts that can't be mapped to files.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1461
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1462
            if (unmappedFontNames.size() > 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1463
                int sz = unmappedFontNames.size();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1464
                for (int i=0; i<sz; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1465
                    String name = unmappedFontNames.get(i);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1466
                    String familyName = fontToFamilyNameMap.get(name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1467
                    if (familyName != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1468
                        ArrayList family = familyToFontListMap.get(familyName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1469
                        if (family != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1470
                            if (family.size() <= 1) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1471
                                familyToFontListMap.remove(familyName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1472
                            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1473
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1474
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1475
                    fontToFamilyNameMap.remove(name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1476
                    if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1477
                        FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1478
                                             .info("No file for font:" + name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1479
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1480
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1481
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1482
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1483
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1484
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1485
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1486
     * In some cases windows may have fonts in the fonts folder that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1487
     * don't show up in the registry or in the GDI calls to enumerate fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1488
     * The only way to find these is to list the directory. We invoke this
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1489
     * only in getAllFonts/Families, so most searches for a specific
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1490
     * font that is satisfied by the GDI/registry calls don't take the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1491
     * additional hit of listing the directory. This hit is small enough
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1492
     * that its not significant in these 'enumerate all the fonts' cases.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1493
     * The basic approach is to cross-reference the files windows found
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1494
     * with the ones in the directory listing approach, and for each
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1495
     * in the latter list that is missing from the former list, register it.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1496
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1497
    private synchronized void checkForUnreferencedFontFiles() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1498
        if (haveCheckedUnreferencedFontFiles) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1499
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1500
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1501
        haveCheckedUnreferencedFontFiles = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1502
        if (!FontUtilities.isWindows) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1503
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1504
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1505
        /* getFontFilesFromPath() returns all lower case names.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1506
         * To compare we also need lower case
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1507
         * versions of the names from the registry.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1508
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1509
        ArrayList<String> registryFiles = new ArrayList<String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1510
        for (String regFile : fontToFileMap.values()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1511
            registryFiles.add(regFile.toLowerCase());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1512
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1513
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1514
        /* To avoid any issues with concurrent modification, create
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1515
         * copies of the existing maps, add the new fonts into these
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1516
         * and then replace the references to the old ones with the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1517
         * new maps. ConcurrentHashmap is another option but its a lot
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1518
         * more changes and with this exception, these maps are intended
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1519
         * to be static.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1520
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1521
        HashMap<String,String> fontToFileMap2 = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1522
        HashMap<String,String> fontToFamilyNameMap2 = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1523
        HashMap<String,ArrayList<String>> familyToFontListMap2 = null;;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1524
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1525
        for (String pathFile : getFontFilesFromPath(false)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1526
            if (!registryFiles.contains(pathFile)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1527
                if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1528
                    FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1529
                                 .info("Found non-registry file : " + pathFile);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1530
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1531
                PhysicalFont f = registerFontFile(getPathName(pathFile));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1532
                if (f == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1533
                    continue;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1534
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1535
                if (fontToFileMap2 == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1536
                    fontToFileMap2 = new HashMap<String,String>(fontToFileMap);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1537
                    fontToFamilyNameMap2 =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1538
                        new HashMap<String,String>(fontToFamilyNameMap);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1539
                    familyToFontListMap2 = new
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1540
                        HashMap<String,ArrayList<String>>(familyToFontListMap);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1541
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1542
                String fontName = f.getFontName(null);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1543
                String family = f.getFamilyName(null);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1544
                String familyLC = family.toLowerCase();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1545
                fontToFamilyNameMap2.put(fontName, family);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1546
                fontToFileMap2.put(fontName, pathFile);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1547
                ArrayList<String> fonts = familyToFontListMap2.get(familyLC);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1548
                if (fonts == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1549
                    fonts = new ArrayList<String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1550
                } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1551
                    fonts = new ArrayList<String>(fonts);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1552
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1553
                fonts.add(fontName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1554
                familyToFontListMap2.put(familyLC, fonts);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1555
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1556
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1557
        if (fontToFileMap2 != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1558
            fontToFileMap = fontToFileMap2;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1559
            familyToFontListMap = familyToFontListMap2;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1560
            fontToFamilyNameMap = fontToFamilyNameMap2;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1561
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1562
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1563
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1564
    private void resolveFontFiles(HashSet<String> unmappedFiles,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1565
                                  ArrayList<String> unmappedFonts) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1566
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1567
        Locale l = SunToolkit.getStartupLocale();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1568
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1569
        for (String file : unmappedFiles) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1570
            try {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1571
                int fn = 0;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1572
                TrueTypeFont ttf;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1573
                String fullPath = getPathName(file);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1574
                if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1575
                    FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1576
                                   .info("Trying to resolve file " + fullPath);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1577
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1578
                do {
7937
3de0a7f48b19 6989370: Windows platform fonts may be incorrectly marked as ineligible for the native rasteriser
prr
parents: 7668
diff changeset
  1579
                    ttf = new TrueTypeFont(fullPath, null, fn++, false);
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1580
                    //  prefer the font's locale name.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1581
                    String fontName = ttf.getFontName(l).toLowerCase();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1582
                    if (unmappedFonts.contains(fontName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1583
                        fontToFileMap.put(fontName, file);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1584
                        unmappedFonts.remove(fontName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1585
                        if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1586
                            FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1587
                                  .info("Resolved absent registry entry for " +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1588
                                        fontName + " located in " + fullPath);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1589
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1590
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1591
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1592
                while (fn < ttf.getFontCount());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1593
            } catch (Exception e) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1594
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1595
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1596
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1597
7950
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1598
    /* Hardwire the English names and expected file names of fonts
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1599
     * commonly used at start up. Avoiding until later even the small
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1600
     * cost of calling platform APIs to locate these can help.
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1601
     * The code that registers these fonts needs to "bail" if any
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1602
     * of the files do not exist, so it will verify the existence of
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1603
     * all non-null file names first.
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1604
     * They are added in to a map with nominally the first
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1605
     * word in the name of the family as the key. In all the cases
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1606
     * we are using the the family name is a single word, and as is
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1607
     * more or less required the family name is the initial sequence
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1608
     * in a full name. So lookup first finds the matching description,
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1609
     * then registers the whole family, returning the right font.
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1610
     */
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1611
    public static class FamilyDescription {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1612
        public String familyName;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1613
        public String plainFullName;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1614
        public String boldFullName;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1615
        public String italicFullName;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1616
        public String boldItalicFullName;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1617
        public String plainFileName;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1618
        public String boldFileName;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1619
        public String italicFileName;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1620
        public String boldItalicFileName;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1621
    }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1622
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1623
    static HashMap<String, FamilyDescription> platformFontMap;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1624
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1625
    /**
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1626
     * default implementation does nothing.
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1627
     */
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1628
    public HashMap<String, FamilyDescription> populateHardcodedFileNameMap() {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1629
        return new HashMap<String, FamilyDescription>(0);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1630
    }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1631
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1632
    Font2D findFontFromPlatformMap(String lcName, int style) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1633
        if (platformFontMap == null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1634
            platformFontMap = populateHardcodedFileNameMap();
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1635
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1636
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1637
        if (platformFontMap == null || platformFontMap.size() == 0) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1638
            return null;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1639
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1640
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1641
        int spaceIndex = lcName.indexOf(' ');
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1642
        String firstWord = lcName;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1643
        if (spaceIndex > 0) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1644
            firstWord = lcName.substring(0, spaceIndex);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1645
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1646
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1647
        FamilyDescription fd = platformFontMap.get(firstWord);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1648
        if (fd == null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1649
            return null;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1650
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1651
        /* Once we've established that its at least the first word,
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1652
         * we need to dig deeper to make sure its a match for either
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1653
         * a full name, or the family name, to make sure its not
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1654
         * a request for some other font that just happens to start
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1655
         * with the same first word.
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1656
         */
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1657
        int styleIndex = -1;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1658
        if (lcName.equalsIgnoreCase(fd.plainFullName)) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1659
            styleIndex = 0;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1660
        } else if (lcName.equalsIgnoreCase(fd.boldFullName)) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1661
            styleIndex = 1;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1662
        } else if (lcName.equalsIgnoreCase(fd.italicFullName)) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1663
            styleIndex = 2;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1664
        } else if (lcName.equalsIgnoreCase(fd.boldItalicFullName)) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1665
            styleIndex = 3;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1666
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1667
        if (styleIndex == -1 && !lcName.equalsIgnoreCase(fd.familyName)) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1668
            return null;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1669
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1670
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1671
        String plainFile = null, boldFile = null,
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1672
            italicFile = null, boldItalicFile = null;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1673
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1674
        boolean failure = false;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1675
        /* In a terminal server config, its possible that getPathName()
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1676
         * will return null, if the file doesn't exist, hence the null
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1677
         * checks on return. But in the normal client config we need to
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1678
         * follow this up with a check to see if all the files really
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1679
         * exist for the non-null paths.
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1680
         */
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1681
         getPlatformFontDirs(noType1Font);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1682
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1683
        if (fd.plainFileName != null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1684
            plainFile = getPathName(fd.plainFileName);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1685
            if (plainFile == null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1686
                failure = true;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1687
            }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1688
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1689
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1690
        if (fd.boldFileName != null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1691
            boldFile = getPathName(fd.boldFileName);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1692
            if (boldFile == null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1693
                failure = true;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1694
            }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1695
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1696
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1697
        if (fd.italicFileName != null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1698
            italicFile = getPathName(fd.italicFileName);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1699
            if (italicFile == null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1700
                failure = true;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1701
            }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1702
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1703
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1704
        if (fd.boldItalicFileName != null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1705
            boldItalicFile = getPathName(fd.boldItalicFileName);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1706
            if (boldItalicFile == null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1707
                failure = true;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1708
            }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1709
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1710
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1711
        if (failure) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1712
            if (FontUtilities.isLogging()) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1713
                FontUtilities.getLogger().
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1714
                    info("Hardcoded file missing looking for " + lcName);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1715
            }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1716
            platformFontMap.remove(firstWord);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1717
            return null;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1718
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1719
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1720
        /* Some of these may be null,as not all styles have to exist */
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1721
        final String[] files = {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1722
            plainFile, boldFile, italicFile, boldItalicFile } ;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1723
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1724
        failure = java.security.AccessController.doPrivileged(
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1725
                 new java.security.PrivilegedAction<Boolean>() {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1726
                     public Boolean run() {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1727
                         for (int i=0; i<files.length; i++) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1728
                             if (files[i] == null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1729
                                 continue;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1730
                             }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1731
                             File f = new File(files[i]);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1732
                             if (!f.exists()) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1733
                                 return Boolean.TRUE;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1734
                             }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1735
                         }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1736
                         return Boolean.FALSE;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1737
                     }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1738
                 });
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1739
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1740
        if (failure) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1741
            if (FontUtilities.isLogging()) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1742
                FontUtilities.getLogger().
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1743
                    info("Hardcoded file missing looking for " + lcName);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1744
            }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1745
            platformFontMap.remove(firstWord);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1746
            return null;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1747
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1748
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1749
        /* If we reach here we know that we have all the files we
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1750
         * expect, so all should be fine so long as the contents
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1751
         * are what we'd expect. Now on to registering the fonts.
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1752
         * Currently this code only looks for TrueType fonts, so format
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1753
         * and rank can be specified without looking at the filename.
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1754
         */
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1755
        Font2D font = null;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1756
        for (int f=0;f<files.length;f++) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1757
            if (files[f] == null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1758
                continue;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1759
            }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1760
            PhysicalFont pf =
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1761
                registerFontFile(files[f], null,
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1762
                                 FONTFORMAT_TRUETYPE, false, Font2D.TTF_RANK);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1763
            if (f == styleIndex) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1764
                font = pf;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1765
            }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1766
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1767
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1768
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1769
        /* Two general cases need a bit more work here.
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1770
         * 1) If font is null, then it was perhaps a request for a
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1771
         * non-existent font, such as "Tahoma Italic", or a family name -
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1772
         * where family and full name of the plain font differ.
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1773
         * Fall back to finding the closest one in the family.
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1774
         * This could still fail if a client specified "Segoe" instead of
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1775
         * "Segoe UI".
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1776
         * 2) The request is of the form "MyFont Bold", style=Font.ITALIC,
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1777
         * and so we want to see if there's a Bold Italic font, or
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1778
         * "MyFamily", style=Font.BOLD, and we may have matched the plain,
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1779
         * but now need to revise that to the BOLD font.
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1780
         */
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1781
        FontFamily fontFamily = FontFamily.getFamily(fd.familyName);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1782
        if (fontFamily != null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1783
            if (font == null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1784
                font = fontFamily.getFont(style);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1785
                if (font == null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1786
                    font = fontFamily.getClosestStyle(style);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1787
                }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1788
            } else if (style > 0 && style != font.style) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1789
                style |= font.style;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1790
                font = fontFamily.getFont(style);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1791
                if (font == null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1792
                    font = fontFamily.getClosestStyle(style);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1793
                }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1794
            }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1795
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1796
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1797
        return font;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  1798
    }
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1799
    private synchronized HashMap<String,String> getFullNameToFileMap() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1800
        if (fontToFileMap == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1801
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1802
            pathDirs = getPlatformFontDirs(noType1Font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1803
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1804
            fontToFileMap = new HashMap<String,String>(100);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1805
            fontToFamilyNameMap = new HashMap<String,String>(100);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1806
            familyToFontListMap = new HashMap<String,ArrayList<String>>(50);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1807
            populateFontFileNameMap(fontToFileMap,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1808
                                    fontToFamilyNameMap,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1809
                                    familyToFontListMap,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1810
                                    Locale.ENGLISH);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1811
            if (FontUtilities.isWindows) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1812
                resolveWindowsFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1813
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1814
            if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1815
                logPlatformFontInfo();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1816
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1817
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1818
        return fontToFileMap;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1819
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1820
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1821
    private void logPlatformFontInfo() {
3938
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 3929
diff changeset
  1822
        PlatformLogger logger = FontUtilities.getLogger();
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1823
        for (int i=0; i< pathDirs.length;i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1824
            logger.info("fontdir="+pathDirs[i]);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1825
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1826
        for (String keyName : fontToFileMap.keySet()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1827
            logger.info("font="+keyName+" file="+ fontToFileMap.get(keyName));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1828
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1829
        for (String keyName : fontToFamilyNameMap.keySet()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1830
            logger.info("font="+keyName+" family="+
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1831
                        fontToFamilyNameMap.get(keyName));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1832
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1833
        for (String keyName : familyToFontListMap.keySet()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1834
            logger.info("family="+keyName+ " fonts="+
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1835
                        familyToFontListMap.get(keyName));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1836
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1837
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1838
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1839
    /* Note this return list excludes logical fonts and JRE fonts */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1840
    protected String[] getFontNamesFromPlatform() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1841
        if (getFullNameToFileMap().size() == 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1842
            return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1843
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1844
        checkForUnreferencedFontFiles();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1845
        /* This odd code with TreeMap is used to preserve a historical
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1846
         * behaviour wrt the sorting order .. */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1847
        ArrayList<String> fontNames = new ArrayList<String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1848
        for (ArrayList<String> a : familyToFontListMap.values()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1849
            for (String s : a) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1850
                fontNames.add(s);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1851
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1852
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1853
        return fontNames.toArray(STR_ARRAY);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1854
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1855
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1856
    public boolean gotFontsFromPlatform() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1857
        return getFullNameToFileMap().size() != 0;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1858
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1859
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1860
    public String getFileNameForFontName(String fontName) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1861
        String fontNameLC = fontName.toLowerCase(Locale.ENGLISH);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1862
        return fontToFileMap.get(fontNameLC);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1863
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1864
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1865
    private PhysicalFont registerFontFile(String file) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1866
        if (new File(file).isAbsolute() &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1867
            !registeredFonts.contains(file)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1868
            int fontFormat = FONTFORMAT_NONE;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1869
            int fontRank = Font2D.UNKNOWN_RANK;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1870
            if (ttFilter.accept(null, file)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1871
                fontFormat = FONTFORMAT_TRUETYPE;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1872
                fontRank = Font2D.TTF_RANK;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1873
            } else if
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1874
                (t1Filter.accept(null, file)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1875
                fontFormat = FONTFORMAT_TYPE1;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1876
                fontRank = Font2D.TYPE1_RANK;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1877
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1878
            if (fontFormat == FONTFORMAT_NONE) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1879
                return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1880
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1881
            return registerFontFile(file, null, fontFormat, false, fontRank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1882
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1883
        return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1884
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1885
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1886
    /* Used to register any font files that are found by platform APIs
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1887
     * that weren't previously found in the standard font locations.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1888
     * the isAbsolute() check is needed since that's whats stored in the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1889
     * set, and on windows, the fonts in the system font directory that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1890
     * are in the fontToFileMap are just basenames. We don't want to try
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1891
     * to register those again, but we do want to register other registry
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1892
     * installed fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1893
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1894
    protected void registerOtherFontFiles(HashSet registeredFontFiles) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1895
        if (getFullNameToFileMap().size() == 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1896
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1897
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1898
        for (String file : fontToFileMap.values()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1899
            registerFontFile(file);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1900
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1901
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1902
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1903
    public boolean
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1904
        getFamilyNamesFromPlatform(TreeMap<String,String> familyNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1905
                                   Locale requestedLocale) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1906
        if (getFullNameToFileMap().size() == 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1907
            return false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1908
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1909
        checkForUnreferencedFontFiles();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1910
        for (String name : fontToFamilyNameMap.values()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1911
            familyNames.put(name.toLowerCase(requestedLocale), name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1912
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1913
        return true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1914
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1915
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1916
    /* Path may be absolute or a base file name relative to one of
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1917
     * the platform font directories
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1918
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1919
    private String getPathName(final String s) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1920
        File f = new File(s);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1921
        if (f.isAbsolute()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1922
            return s;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1923
        } else if (pathDirs.length==1) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1924
            return pathDirs[0] + File.separator + s;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1925
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1926
            String path = java.security.AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1927
                 new java.security.PrivilegedAction<String>() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1928
                     public String run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1929
                         for (int p=0; p<pathDirs.length; p++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1930
                             File f = new File(pathDirs[p] +File.separator+ s);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1931
                             if (f.exists()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1932
                                 return f.getAbsolutePath();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1933
                             }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1934
                         }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1935
                         return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1936
                     }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1937
                });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1938
            if (path != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1939
                return path;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1940
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1941
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1942
        return s; // shouldn't happen, but harmless
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1943
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1944
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1945
    /* lcName is required to be lower case for use as a key.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1946
     * lcName may be a full name, or a family name, and style may
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1947
     * be specified in addition to either of these. So be sure to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1948
     * get the right one. Since an app *could* ask for "Foo Regular"
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1949
     * and later ask for "Foo Italic", if we don't register all the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1950
     * styles, then logic in findFont2D may try to style the original
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1951
     * so we register the entire family if we get a match here.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1952
     * This is still a big win because this code is invoked where
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1953
     * otherwise we would register all fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1954
     * It's also useful for the case where "Foo Bold" was specified with
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1955
     * style Font.ITALIC, as we would want in that case to try to return
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1956
     * "Foo Bold Italic" if it exists, and it is only by locating "Foo Bold"
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1957
     * and opening it that we really "know" it's Bold, and can look for
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1958
     * a font that supports that and the italic style.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1959
     * The code in here is not overtly windows-specific but in fact it
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1960
     * is unlikely to be useful as is on other platforms. It is maintained
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1961
     * in this shared source file to be close to its sole client and
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1962
     * because so much of the logic is intertwined with the logic in
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1963
     * findFont2D.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1964
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1965
    private Font2D findFontFromPlatform(String lcName, int style) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1966
        if (getFullNameToFileMap().size() == 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1967
            return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1968
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1969
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1970
        ArrayList<String> family = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1971
        String fontFile = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1972
        String familyName = fontToFamilyNameMap.get(lcName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1973
        if (familyName != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1974
            fontFile = fontToFileMap.get(lcName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1975
            family = familyToFontListMap.get
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1976
                (familyName.toLowerCase(Locale.ENGLISH));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1977
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1978
            family = familyToFontListMap.get(lcName); // is lcName is a family?
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1979
            if (family != null && family.size() > 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1980
                String lcFontName = family.get(0).toLowerCase(Locale.ENGLISH);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1981
                if (lcFontName != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1982
                    familyName = fontToFamilyNameMap.get(lcFontName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1983
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1984
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1985
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1986
        if (family == null || familyName == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1987
            return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1988
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1989
        String [] fontList = (String[])family.toArray(STR_ARRAY);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1990
        if (fontList.length == 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1991
            return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1992
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1993
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1994
        /* first check that for every font in this family we can find
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1995
         * a font file. The specific reason for doing this is that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1996
         * in at least one case on Windows a font has the face name "David"
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1997
         * but the registry entry is "David Regular". That is the "unique"
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1998
         * name of the font but in other cases the registry contains the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  1999
         * "full" name. See the specifications of name ids 3 and 4 in the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2000
         * TrueType 'name' table.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2001
         * In general this could cause a problem that we fail to register
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2002
         * if we all members of a family that we may end up mapping to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2003
         * the wrong font member: eg return Bold when Plain is needed.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2004
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2005
        for (int f=0;f<fontList.length;f++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2006
            String fontNameLC = fontList[f].toLowerCase(Locale.ENGLISH);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2007
            String fileName = fontToFileMap.get(fontNameLC);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2008
            if (fileName == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2009
                if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2010
                    FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2011
                          .info("Platform lookup : No file for font " +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2012
                                fontList[f] + " in family " +familyName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2013
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2014
                return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2015
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2016
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2017
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2018
        /* Currently this code only looks for TrueType fonts, so format
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2019
         * and rank can be specified without looking at the filename.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2020
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2021
        PhysicalFont physicalFont = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2022
        if (fontFile != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2023
            physicalFont = registerFontFile(getPathName(fontFile), null,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2024
                                            FONTFORMAT_TRUETYPE, false,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2025
                                            Font2D.TTF_RANK);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2026
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2027
        /* Register all fonts in this family. */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2028
        for (int f=0;f<fontList.length;f++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2029
            String fontNameLC = fontList[f].toLowerCase(Locale.ENGLISH);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2030
            String fileName = fontToFileMap.get(fontNameLC);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2031
            if (fontFile != null && fontFile.equals(fileName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2032
                continue;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2033
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2034
            /* Currently this code only looks for TrueType fonts, so format
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2035
             * and rank can be specified without looking at the filename.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2036
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2037
            registerFontFile(getPathName(fileName), null,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2038
                             FONTFORMAT_TRUETYPE, false, Font2D.TTF_RANK);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2039
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2040
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2041
        Font2D font = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2042
        FontFamily fontFamily = FontFamily.getFamily(familyName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2043
        /* Handle case where request "MyFont Bold", style=Font.ITALIC */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2044
        if (physicalFont != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2045
            style |= physicalFont.style;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2046
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2047
        if (fontFamily != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2048
            font = fontFamily.getFont(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2049
            if (font == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2050
                font = fontFamily.getClosestStyle(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2051
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2052
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2053
        return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2054
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2055
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2056
    private ConcurrentHashMap<String, Font2D> fontNameCache =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2057
        new ConcurrentHashMap<String, Font2D>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2058
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2059
    /*
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2060
     * The client supplies a name and a style.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2061
     * The name could be a family name, or a full name.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2062
     * A font may exist with the specified style, or it may
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2063
     * exist only in some other style. For non-native fonts the scaler
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2064
     * may be able to emulate the required style.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2065
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2066
    public Font2D findFont2D(String name, int style, int fallback) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2067
        String lowerCaseName = name.toLowerCase(Locale.ENGLISH);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2068
        String mapName = lowerCaseName + dotStyleStr(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2069
        Font2D font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2070
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2071
        /* If preferLocaleFonts() or preferProportionalFonts() has been
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2072
         * called we may be using an alternate set of composite fonts in this
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2073
         * app context. The presence of a pre-built name map indicates whether
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2074
         * this is so, and gives access to the alternate composite for the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2075
         * name.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2076
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2077
        if (_usingPerAppContextComposites) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2078
            ConcurrentHashMap<String, Font2D> altNameCache =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2079
                (ConcurrentHashMap<String, Font2D>)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2080
                AppContext.getAppContext().get(CompositeFont.class);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2081
            if (altNameCache != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2082
                font = (Font2D)altNameCache.get(mapName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2083
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2084
                font = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2085
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2086
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2087
            font = fontNameCache.get(mapName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2088
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2089
        if (font != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2090
            return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2091
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2092
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2093
        if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2094
            FontUtilities.getLogger().info("Search for font: " + name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2095
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2096
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2097
        // The check below is just so that the bitmap fonts being set by
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2098
        // AWT and Swing thru the desktop properties do not trigger the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2099
        // the load fonts case. The two bitmap fonts are now mapped to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2100
        // appropriate equivalents for serif and sansserif.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2101
        // Note that the cost of this comparison is only for the first
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2102
        // call until the map is filled.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2103
        if (FontUtilities.isWindows) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2104
            if (lowerCaseName.equals("ms sans serif")) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2105
                name = "sansserif";
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2106
            } else if (lowerCaseName.equals("ms serif")) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2107
                name = "serif";
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2108
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2109
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2110
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2111
        /* This isn't intended to support a client passing in the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2112
         * string default, but if a client passes in null for the name
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2113
         * the java.awt.Font class internally substitutes this name.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2114
         * So we need to recognise it here to prevent a loadFonts
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2115
         * on the unrecognised name. The only potential problem with
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2116
         * this is it would hide any real font called "default"!
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2117
         * But that seems like a potential problem we can ignore for now.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2118
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2119
        if (lowerCaseName.equals("default")) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2120
            name = "dialog";
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2121
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2122
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2123
        /* First see if its a family name. */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2124
        FontFamily family = FontFamily.getFamily(name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2125
        if (family != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2126
            font = family.getFontWithExactStyleMatch(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2127
            if (font == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2128
                font = findDeferredFont(name, style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2129
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2130
            if (font == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2131
                font = family.getFont(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2132
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2133
            if (font == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2134
                font = family.getClosestStyle(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2135
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2136
            if (font != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2137
                fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2138
                return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2139
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2140
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2141
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2142
        /* If it wasn't a family name, it should be a full name of
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2143
         * either a composite, or a physical font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2144
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2145
        font = fullNameToFont.get(lowerCaseName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2146
        if (font != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2147
            /* Check that the requested style matches the matched font's style.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2148
             * But also match style automatically if the requested style is
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2149
             * "plain". This because the existing behaviour is that the fonts
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2150
             * listed via getAllFonts etc always list their style as PLAIN.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2151
             * This does lead to non-commutative behaviours where you might
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2152
             * start with "Lucida Sans Regular" and ask for a BOLD version
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2153
             * and get "Lucida Sans DemiBold" but if you ask for the PLAIN
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2154
             * style of "Lucida Sans DemiBold" you get "Lucida Sans DemiBold".
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2155
             * This consistent however with what happens if you have a bold
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2156
             * version of a font and no plain version exists - alg. styling
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2157
             * doesn't "unbolden" the font.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2158
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2159
            if (font.style == style || style == Font.PLAIN) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2160
                fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2161
                return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2162
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2163
                /* If it was a full name like "Lucida Sans Regular", but
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2164
                 * the style requested is "bold", then we want to see if
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2165
                 * there's the appropriate match against another font in
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2166
                 * that family before trying to load all fonts, or applying a
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2167
                 * algorithmic styling
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2168
                 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2169
                family = FontFamily.getFamily(font.getFamilyName(null));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2170
                if (family != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2171
                    Font2D familyFont = family.getFont(style|font.style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2172
                    /* We exactly matched the requested style, use it! */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2173
                    if (familyFont != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2174
                        fontNameCache.put(mapName, familyFont);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2175
                        return familyFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2176
                    } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2177
                        /* This next call is designed to support the case
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2178
                         * where bold italic is requested, and if we must
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2179
                         * style, then base it on either bold or italic -
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2180
                         * not on plain!
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2181
                         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2182
                        familyFont = family.getClosestStyle(style|font.style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2183
                        if (familyFont != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2184
                            /* The next check is perhaps one
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2185
                             * that shouldn't be done. ie if we get this
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2186
                             * far we have probably as close a match as we
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2187
                             * are going to get. We could load all fonts to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2188
                             * see if somehow some parts of the family are
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2189
                             * loaded but not all of it.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2190
                             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2191
                            if (familyFont.canDoStyle(style|font.style)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2192
                                fontNameCache.put(mapName, familyFont);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2193
                                return familyFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2194
                            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2195
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2196
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2197
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2198
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2199
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2200
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2201
        if (FontUtilities.isWindows) {
7950
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  2202
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  2203
            font = findFontFromPlatformMap(lowerCaseName, style);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  2204
            if (FontUtilities.isLogging()) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  2205
                FontUtilities.getLogger()
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  2206
                    .info("findFontFromPlatformMap returned " + font);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  2207
            }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  2208
            if (font != null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  2209
                fontNameCache.put(mapName, font);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  2210
                return font;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  2211
            }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  2212
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2213
            /* Don't want Windows to return a Lucida Sans font from
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2214
             * C:\Windows\Fonts
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2215
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2216
            if (deferredFontFiles.size() > 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2217
                font = findJREDeferredFont(lowerCaseName, style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2218
                if (font != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2219
                    fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2220
                    return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2221
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2222
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2223
            font = findFontFromPlatform(lowerCaseName, style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2224
            if (font != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2225
                if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2226
                    FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2227
                          .info("Found font via platform API for request:\"" +
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2228
                                name + "\":, style="+style+
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2229
                                " found font: " + font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2230
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2231
                fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2232
                return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2233
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2234
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2235
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2236
        /* If reach here and no match has been located, then if there are
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2237
         * uninitialised deferred fonts, load as many of those as needed
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2238
         * to find the deferred font. If none is found through that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2239
         * search continue on.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2240
         * There is possibly a minor issue when more than one
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2241
         * deferred font implements the same font face. Since deferred
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2242
         * fonts are only those in font configuration files, this is a
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2243
         * controlled situation, the known case being Solaris euro_fonts
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2244
         * versions of Arial, Times New Roman, Courier New. However
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2245
         * the larger font will transparently replace the smaller one
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2246
         *  - see addToFontList() - when it is needed by the composite font.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2247
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2248
        if (deferredFontFiles.size() > 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2249
            font = findDeferredFont(name, style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2250
            if (font != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2251
                fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2252
                return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2253
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2254
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2255
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2256
        /* Some apps use deprecated 1.0 names such as helvetica and courier. On
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2257
         * Solaris these are Type1 fonts in /usr/openwin/lib/X11/fonts/Type1.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2258
         * If running on Solaris will register all the fonts in this
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2259
         * directory.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2260
         * May as well register the whole directory without actually testing
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2261
         * the font name is one of the deprecated names as the next step would
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2262
         * load all fonts which are in this directory anyway.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2263
         * In the event that this lookup is successful it potentially "hides"
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2264
         * TrueType versions of such fonts that are elsewhere but since they
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2265
         * do not exist on Solaris this is not a problem.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2266
         * Set a flag to indicate we've done this registration to avoid
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2267
         * repetition and more seriously, to avoid recursion.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2268
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2269
        if (FontUtilities.isSolaris &&!loaded1dot0Fonts) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2270
            /* "timesroman" is a special case since that's not the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2271
             * name of any known font on Solaris or elsewhere.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2272
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2273
            if (lowerCaseName.equals("timesroman")) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2274
                font = findFont2D("serif", style, fallback);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2275
                fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2276
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2277
            register1dot0Fonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2278
            loaded1dot0Fonts = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2279
            Font2D ff = findFont2D(name, style, fallback);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2280
            return ff;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2281
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2282
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2283
        /* We check for application registered fonts before
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2284
         * explicitly loading all fonts as if necessary the registration
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2285
         * code will have done so anyway. And we don't want to needlessly
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2286
         * load the actual files for all fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2287
         * Just as for installed fonts we check for family before fullname.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2288
         * We do not add these fonts to fontNameCache for the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2289
         * app context case which eliminates the overhead of a per context
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2290
         * cache for these.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2291
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2292
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2293
        if (fontsAreRegistered || fontsAreRegisteredPerAppContext) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2294
            Hashtable<String, FontFamily> familyTable = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2295
            Hashtable<String, Font2D> nameTable;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2296
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2297
            if (fontsAreRegistered) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2298
                familyTable = createdByFamilyName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2299
                nameTable = createdByFullName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2300
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2301
                AppContext appContext = AppContext.getAppContext();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2302
                familyTable =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2303
                    (Hashtable<String,FontFamily>)appContext.get(regFamilyKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2304
                nameTable =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2305
                    (Hashtable<String,Font2D>)appContext.get(regFullNameKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2306
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2307
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2308
            family = familyTable.get(lowerCaseName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2309
            if (family != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2310
                font = family.getFontWithExactStyleMatch(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2311
                if (font == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2312
                    font = family.getFont(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2313
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2314
                if (font == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2315
                    font = family.getClosestStyle(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2316
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2317
                if (font != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2318
                    if (fontsAreRegistered) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2319
                        fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2320
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2321
                    return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2322
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2323
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2324
            font = nameTable.get(lowerCaseName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2325
            if (font != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2326
                if (fontsAreRegistered) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2327
                    fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2328
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2329
                return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2330
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2331
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2332
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2333
        /* If reach here and no match has been located, then if all fonts
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2334
         * are not yet loaded, do so, and then recurse.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2335
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2336
        if (!loadedAllFonts) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2337
            if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2338
                FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2339
                                       .info("Load fonts looking for:" + name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2340
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2341
            loadFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2342
            loadedAllFonts = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2343
            return findFont2D(name, style, fallback);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2344
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2345
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2346
        if (!loadedAllFontFiles) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2347
            if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2348
                FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2349
                                  .info("Load font files looking for:" + name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2350
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2351
            loadFontFiles();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2352
            loadedAllFontFiles = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2353
            return findFont2D(name, style, fallback);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2354
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2355
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2356
        /* The primary name is the locale default - ie not US/English but
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2357
         * whatever is the default in this locale. This is the way it always
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2358
         * has been but may be surprising to some developers if "Arial Regular"
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2359
         * were hard-coded in their app and yet "Arial Regular" was not the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2360
         * default name. Fortunately for them, as a consequence of the JDK
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2361
         * supporting returning names and family names for arbitrary locales,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2362
         * we also need to support searching all localised names for a match.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2363
         * But because this case of the name used to reference a font is not
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2364
         * the same as the default for this locale is rare, it makes sense to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2365
         * search a much shorter list of default locale names and only go to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2366
         * a longer list of names in the event that no match was found.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2367
         * So add here code which searches localised names too.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2368
         * As in 1.4.x this happens only after loading all fonts, which
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2369
         * is probably the right order.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2370
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2371
        if ((font = findFont2DAllLocales(name, style)) != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2372
            fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2373
            return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2374
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2375
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2376
        /* Perhaps its a "compatibility" name - timesroman, helvetica,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2377
         * or courier, which 1.0 apps used for logical fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2378
         * We look for these "late" after a loadFonts as we must not
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2379
         * hide real fonts of these names.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2380
         * Map these appropriately:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2381
         * On windows this means according to the rules specified by the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2382
         * FontConfiguration : do it only for encoding==Cp1252
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2383
         *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2384
         * REMIND: this is something we plan to remove.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2385
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2386
        if (FontUtilities.isWindows) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2387
            String compatName =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2388
                getFontConfiguration().getFallbackFamilyName(name, null);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2389
            if (compatName != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2390
                font = findFont2D(compatName, style, fallback);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2391
                fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2392
                return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2393
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2394
        } else if (lowerCaseName.equals("timesroman")) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2395
            font = findFont2D("serif", style, fallback);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2396
            fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2397
            return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2398
        } else if (lowerCaseName.equals("helvetica")) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2399
            font = findFont2D("sansserif", style, fallback);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2400
            fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2401
            return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2402
        } else if (lowerCaseName.equals("courier")) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2403
            font = findFont2D("monospaced", style, fallback);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2404
            fontNameCache.put(mapName, font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2405
            return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2406
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2407
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2408
        if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2409
            FontUtilities.getLogger().info("No font found for:" + name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2410
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2411
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2412
        switch (fallback) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2413
        case PHYSICAL_FALLBACK: return getDefaultPhysicalFont();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2414
        case LOGICAL_FALLBACK: return getDefaultLogicalFont(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2415
        default: return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2416
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2417
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2418
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2419
    /*
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2420
     * Workaround for apps which are dependent on a font metrics bug
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2421
     * in JDK 1.1. This is an unsupported win32 private setting.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2422
     * Left in for a customer - do not remove.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2423
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2424
    public boolean usePlatformFontMetrics() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2425
        return usePlatformFontMetrics;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2426
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2427
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2428
    public int getNumFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2429
        return physicalFonts.size()+maxCompFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2430
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2431
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2432
    private static boolean fontSupportsEncoding(Font font, String encoding) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2433
        return FontUtilities.getFont2D(font).supportsEncoding(encoding);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2434
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2435
7944
26b96bf47c49 6983037: closed/java/awt/font/FontNames/Type1Fonts.java failed due to missed font
prr
parents: 7937
diff changeset
  2436
    protected abstract String getFontPath(boolean noType1Fonts);
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2437
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2438
    private Thread fileCloser = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2439
    Vector<File> tmpFontFiles = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2440
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2441
    public Font2D createFont2D(File fontFile, int fontFormat,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2442
                               boolean isCopy, CreatedFontTracker tracker)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2443
    throws FontFormatException {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2444
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2445
        String fontFilePath = fontFile.getPath();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2446
        FileFont font2D = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2447
        final File fFile = fontFile;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2448
        final CreatedFontTracker _tracker = tracker;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2449
        try {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2450
            switch (fontFormat) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2451
            case Font.TRUETYPE_FONT:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2452
                font2D = new TrueTypeFont(fontFilePath, null, 0, true);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2453
                break;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2454
            case Font.TYPE1_FONT:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2455
                font2D = new Type1Font(fontFilePath, null, isCopy);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2456
                break;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2457
            default:
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2458
                throw new FontFormatException("Unrecognised Font Format");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2459
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2460
        } catch (FontFormatException e) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2461
            if (isCopy) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2462
                java.security.AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2463
                     new java.security.PrivilegedAction() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2464
                          public Object run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2465
                              if (_tracker != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2466
                                  _tracker.subBytes((int)fFile.length());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2467
                              }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2468
                              fFile.delete();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2469
                              return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2470
                          }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2471
                });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2472
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2473
            throw(e);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2474
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2475
        if (isCopy) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2476
            font2D.setFileToRemove(fontFile, tracker);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2477
            synchronized (FontManager.class) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2478
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2479
                if (tmpFontFiles == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2480
                    tmpFontFiles = new Vector<File>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2481
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2482
                tmpFontFiles.add(fontFile);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2483
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2484
                if (fileCloser == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2485
                    final Runnable fileCloserRunnable = new Runnable() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2486
                      public void run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2487
                         java.security.AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2488
                         new java.security.PrivilegedAction() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2489
                         public Object run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2490
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2491
                            for (int i=0;i<CHANNELPOOLSIZE;i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2492
                                if (fontFileCache[i] != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2493
                                    try {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2494
                                        fontFileCache[i].close();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2495
                                    } catch (Exception e) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2496
                                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2497
                                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2498
                            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2499
                            if (tmpFontFiles != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2500
                                File[] files = new File[tmpFontFiles.size()];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2501
                                files = tmpFontFiles.toArray(files);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2502
                                for (int f=0; f<files.length;f++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2503
                                    try {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2504
                                        files[f].delete();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2505
                                    } catch (Exception e) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2506
                                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2507
                                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2508
                            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2509
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2510
                            return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2511
                          }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2512
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2513
                          });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2514
                      }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2515
                    };
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2516
                    java.security.AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2517
                       new java.security.PrivilegedAction() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2518
                          public Object run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2519
                              /* The thread must be a member of a thread group
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2520
                               * which will not get GCed before VM exit.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2521
                               * Make its parent the top-level thread group.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2522
                               */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2523
                              ThreadGroup tg =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2524
                                  Thread.currentThread().getThreadGroup();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2525
                              for (ThreadGroup tgn = tg;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2526
                                   tgn != null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2527
                                   tg = tgn, tgn = tg.getParent());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2528
                              fileCloser = new Thread(tg, fileCloserRunnable);
5275
fa9f5ce2006e 6936389: FontManager.fileCloser may cause memory leak in applets
bae
parents: 4954
diff changeset
  2529
                              fileCloser.setContextClassLoader(null);
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2530
                              Runtime.getRuntime().addShutdownHook(fileCloser);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2531
                              return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2532
                          }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2533
                    });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2534
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2535
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2536
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2537
        return font2D;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2538
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2539
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2540
    /* remind: used in X11GraphicsEnvironment and called often enough
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2541
     * that we ought to obsolete this code
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2542
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2543
    public synchronized String getFullNameByFileName(String fileName) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2544
        PhysicalFont[] physFonts = getPhysicalFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2545
        for (int i=0;i<physFonts.length;i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2546
            if (physFonts[i].platName.equals(fileName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2547
                return (physFonts[i].getFontName(null));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2548
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2549
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2550
        return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2551
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2552
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2553
    /*
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2554
     * This is called when font is determined to be invalid/bad.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2555
     * It designed to be called (for example) by the font scaler
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2556
     * when in processing a font file it is discovered to be incorrect.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2557
     * This is different than the case where fonts are discovered to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2558
     * be incorrect during initial verification, as such fonts are
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2559
     * never registered.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2560
     * Handles to this font held are re-directed to a default font.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2561
     * This default may not be an ideal substitute buts it better than
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2562
     * crashing This code assumes a PhysicalFont parameter as it doesn't
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2563
     * make sense for a Composite to be "bad".
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2564
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2565
    public synchronized void deRegisterBadFont(Font2D font2D) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2566
        if (!(font2D instanceof PhysicalFont)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2567
            /* We should never reach here, but just in case */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2568
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2569
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2570
            if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2571
                FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2572
                                     .severe("Deregister bad font: " + font2D);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2573
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2574
            replaceFont((PhysicalFont)font2D, getDefaultPhysicalFont());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2575
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2576
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2577
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2578
    /*
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2579
     * This encapsulates all the work that needs to be done when a
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2580
     * Font2D is replaced by a different Font2D.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2581
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2582
    public synchronized void replaceFont(PhysicalFont oldFont,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2583
                                         PhysicalFont newFont) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2584
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2585
        if (oldFont.handle.font2D != oldFont) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2586
            /* already done */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2587
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2588
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2589
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2590
        /* If we try to replace the font with itself, that won't work,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2591
         * so pick any alternative physical font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2592
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2593
        if (oldFont == newFont) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2594
            if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2595
                FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2596
                      .severe("Can't replace bad font with itself " + oldFont);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2597
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2598
            PhysicalFont[] physFonts = getPhysicalFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2599
            for (int i=0; i<physFonts.length;i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2600
                if (physFonts[i] != newFont) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2601
                    newFont = physFonts[i];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2602
                    break;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2603
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2604
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2605
            if (oldFont == newFont) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2606
                if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2607
                    FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2608
                           .severe("This is bad. No good physicalFonts found.");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2609
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2610
                return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2611
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2612
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2613
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2614
        /* eliminate references to this font, so it won't be located
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2615
         * by future callers, and will be eligible for GC when all
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2616
         * references are removed
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2617
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2618
        oldFont.handle.font2D = newFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2619
        physicalFonts.remove(oldFont.fullName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2620
        fullNameToFont.remove(oldFont.fullName.toLowerCase(Locale.ENGLISH));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2621
        FontFamily.remove(oldFont);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2622
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2623
        if (localeFullNamesToFont != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2624
            Map.Entry[] mapEntries =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2625
                (Map.Entry[])localeFullNamesToFont.entrySet().
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2626
                toArray(new Map.Entry[0]);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2627
            /* Should I be replacing these, or just I just remove
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2628
             * the names from the map?
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2629
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2630
            for (int i=0; i<mapEntries.length;i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2631
                if (mapEntries[i].getValue() == oldFont) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2632
                    try {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2633
                        mapEntries[i].setValue(newFont);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2634
                    } catch (Exception e) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2635
                        /* some maps don't support this operation.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2636
                         * In this case just give up and remove the entry.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2637
                         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2638
                        localeFullNamesToFont.remove(mapEntries[i].getKey());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2639
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2640
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2641
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2642
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2643
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2644
        for (int i=0; i<maxCompFont; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2645
            /* Deferred initialization of composites shouldn't be
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2646
             * a problem for this case, since a font must have been
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2647
             * initialised to be discovered to be bad.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2648
             * Some JRE composites on Solaris use two versions of the same
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2649
             * font. The replaced font isn't bad, just "smaller" so there's
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2650
             * no need to make the slot point to the new font.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2651
             * Since composites have a direct reference to the Font2D (not
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2652
             * via a handle) making this substitution is not safe and could
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2653
             * cause an additional problem and so this substitution is
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2654
             * warranted only when a font is truly "bad" and could cause
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2655
             * a crash. So we now replace it only if its being substituted
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2656
             * with some font other than a fontconfig rank font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2657
             * Since in practice a substitution will have the same rank
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2658
             * this may never happen, but the code is safer even if its
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2659
             * also now a no-op.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2660
             * The only obvious "glitch" from this stems from the current
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2661
             * implementation that when asked for the number of glyphs in a
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2662
             * composite it lies and returns the number in slot 0 because
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2663
             * composite glyphs aren't contiguous. Since we live with that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2664
             * we can live with the glitch that depending on how it was
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2665
             * initialised a composite may return different values for this.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2666
             * Fixing the issues with composite glyph ids is tricky as
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2667
             * there are exclusion ranges and unlike other fonts even the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2668
             * true "numGlyphs" isn't a contiguous range. Likely the only
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2669
             * solution is an API that returns an array of glyph ranges
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2670
             * which takes precedence over the existing API. That might
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2671
             * also need to address excluding ranges which represent a
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2672
             * code point supported by an earlier component.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2673
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2674
            if (newFont.getRank() > Font2D.FONT_CONFIG_RANK) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2675
                compFonts[i].replaceComponentFont(oldFont, newFont);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2676
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2677
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2678
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2679
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2680
    private synchronized void loadLocaleNames() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2681
        if (localeFullNamesToFont != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2682
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2683
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2684
        localeFullNamesToFont = new HashMap<String, TrueTypeFont>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2685
        Font2D[] fonts = getRegisteredFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2686
        for (int i=0; i<fonts.length; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2687
            if (fonts[i] instanceof TrueTypeFont) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2688
                TrueTypeFont ttf = (TrueTypeFont)fonts[i];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2689
                String[] fullNames = ttf.getAllFullNames();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2690
                for (int n=0; n<fullNames.length; n++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2691
                    localeFullNamesToFont.put(fullNames[n], ttf);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2692
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2693
                FontFamily family = FontFamily.getFamily(ttf.familyName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2694
                if (family != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2695
                    FontFamily.addLocaleNames(family, ttf.getAllFamilyNames());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2696
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2697
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2698
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2699
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2700
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2701
    /* This replicate the core logic of findFont2D but operates on
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2702
     * all the locale names. This hasn't been merged into findFont2D to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2703
     * keep the logic simpler and reduce overhead, since this case is
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2704
     * almost never used. The main case in which it is called is when
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2705
     * a bogus font name is used and we need to check all possible names
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2706
     * before returning the default case.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2707
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2708
    private Font2D findFont2DAllLocales(String name, int style) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2709
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2710
        if (FontUtilities.isLogging()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2711
            FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2712
                           .info("Searching localised font names for:" + name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2713
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2714
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2715
        /* If reach here and no match has been located, then if we have
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2716
         * not yet built the map of localeFullNamesToFont for TT fonts, do so
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2717
         * now. This method must be called after all fonts have been loaded.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2718
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2719
        if (localeFullNamesToFont == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2720
            loadLocaleNames();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2721
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2722
        String lowerCaseName = name.toLowerCase();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2723
        Font2D font = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2724
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2725
        /* First see if its a family name. */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2726
        FontFamily family = FontFamily.getLocaleFamily(lowerCaseName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2727
        if (family != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2728
          font = family.getFont(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2729
          if (font == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2730
            font = family.getClosestStyle(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2731
          }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2732
          if (font != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2733
              return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2734
          }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2735
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2736
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2737
        /* If it wasn't a family name, it should be a full name. */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2738
        synchronized (this) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2739
            font = localeFullNamesToFont.get(name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2740
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2741
        if (font != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2742
            if (font.style == style || style == Font.PLAIN) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2743
                return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2744
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2745
                family = FontFamily.getFamily(font.getFamilyName(null));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2746
                if (family != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2747
                    Font2D familyFont = family.getFont(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2748
                    /* We exactly matched the requested style, use it! */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2749
                    if (familyFont != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2750
                        return familyFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2751
                    } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2752
                        familyFont = family.getClosestStyle(style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2753
                        if (familyFont != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2754
                            /* The next check is perhaps one
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2755
                             * that shouldn't be done. ie if we get this
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2756
                             * far we have probably as close a match as we
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2757
                             * are going to get. We could load all fonts to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2758
                             * see if somehow some parts of the family are
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2759
                             * loaded but not all of it.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2760
                             * This check is commented out for now.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2761
                             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2762
                            if (!familyFont.canDoStyle(style)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2763
                                familyFont = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2764
                            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2765
                            return familyFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2766
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2767
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2768
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2769
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2770
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2771
        return font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2772
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2773
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2774
    /* Supporting "alternate" composite fonts on 2D graphics objects
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2775
     * is accessed by the application by calling methods on the local
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2776
     * GraphicsEnvironment. The overall implementation is described
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2777
     * in one place, here, since otherwise the implementation is spread
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2778
     * around it may be difficult to track.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2779
     * The methods below call into SunGraphicsEnvironment which creates a
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2780
     * new FontConfiguration instance. The FontConfiguration class,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2781
     * and its platform sub-classes are updated to take parameters requesting
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2782
     * these behaviours. This is then used to create new composite font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2783
     * instances. Since this calls the initCompositeFont method in
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2784
     * SunGraphicsEnvironment it performs the same initialization as is
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2785
     * performed normally. There may be some duplication of effort, but
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2786
     * that code is already written to be able to perform properly if called
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2787
     * to duplicate work. The main difference is that if we detect we are
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2788
     * running in an applet/browser/Java plugin environment these new fonts
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2789
     * are not placed in the "default" maps but into an AppContext instance.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2790
     * The font lookup mechanism in java.awt.Font.getFont2D() is also updated
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2791
     * so that look-up for composite fonts will in that case always
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2792
     * do a lookup rather than returning a cached result.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2793
     * This is inefficient but necessary else singleton java.awt.Font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2794
     * instances would not retrieve the correct Font2D for the appcontext.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2795
     * sun.font.FontManager.findFont2D is also updated to that it uses
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2796
     * a name map cache specific to that appcontext.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2797
     *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2798
     * Getting an AppContext is expensive, so there is a global variable
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2799
     * that records whether these methods have ever been called and can
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2800
     * avoid the expense for almost all applications. Once the correct
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2801
     * CompositeFont is associated with the Font, everything should work
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2802
     * through existing mechanisms.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2803
     * A special case is that GraphicsEnvironment.getAllFonts() must
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2804
     * return an AppContext specific list.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2805
     *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2806
     * Calling the methods below is "heavyweight" but it is expected that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2807
     * these methods will be called very rarely.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2808
     *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2809
     * If _usingPerAppContextComposites is true, we are in "applet"
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2810
     * (eg browser) enviroment and at least one context has selected
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2811
     * an alternate composite font behaviour.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2812
     * If _usingAlternateComposites is true, we are not in an "applet"
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2813
     * environment and the (single) application has selected
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2814
     * an alternate composite font behaviour.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2815
     *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2816
     * - Printing: The implementation delegates logical fonts to an AWT
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2817
     * mechanism which cannot use these alternate configurations.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2818
     * We can detect that alternate fonts are in use and back-off to 2D, but
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2819
     * that uses outlines. Much of this can be fixed with additional work
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2820
     * but that may have to wait. The results should be correct, just not
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2821
     * optimal.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2822
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2823
    private static final Object altJAFontKey       = new Object();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2824
    private static final Object localeFontKey       = new Object();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2825
    private static final Object proportionalFontKey = new Object();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2826
    private boolean _usingPerAppContextComposites = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2827
    private boolean _usingAlternateComposites = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2828
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2829
    /* These values are used only if we are running as a standalone
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2830
     * application, as determined by maybeMultiAppContext();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2831
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2832
    private static boolean gAltJAFont = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2833
    private boolean gLocalePref = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2834
    private boolean gPropPref = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2835
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2836
    /* This method doesn't check if alternates are selected in this app
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2837
     * context. Its used by the FontMetrics caching code which in such
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2838
     * a case cannot retrieve a cached metrics solely on the basis of
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2839
     * the Font.equals() method since it needs to also check if the Font2D
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2840
     * is the same.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2841
     * We also use non-standard composites for Swing native L&F fonts on
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2842
     * Windows. In that case the policy is that the metrics reported are
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2843
     * based solely on the physical font in the first slot which is the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2844
     * visible java.awt.Font. So in that case the metrics cache which tests
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2845
     * the Font does what we want. In the near future when we expand the GTK
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2846
     * logical font definitions we may need to revisit this if GTK reports
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2847
     * combined metrics instead. For now though this test can be simple.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2848
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2849
    public boolean maybeUsingAlternateCompositeFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2850
       return _usingAlternateComposites || _usingPerAppContextComposites;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2851
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2852
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2853
    public boolean usingAlternateCompositeFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2854
        return (_usingAlternateComposites ||
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2855
                (_usingPerAppContextComposites &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2856
                AppContext.getAppContext().get(CompositeFont.class) != null));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2857
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2858
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2859
    private static boolean maybeMultiAppContext() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2860
        Boolean appletSM = (Boolean)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2861
            java.security.AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2862
                new java.security.PrivilegedAction() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2863
                        public Object run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2864
                            SecurityManager sm = System.getSecurityManager();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2865
                            return new Boolean
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2866
                                (sm instanceof sun.applet.AppletSecurity);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2867
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2868
                    });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2869
        return appletSM.booleanValue();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2870
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2871
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2872
    /* Modifies the behaviour of a subsequent call to preferLocaleFonts()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2873
     * to use Mincho instead of Gothic for dialoginput in JA locales
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2874
     * on windows. Not needed on other platforms.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2875
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2876
    public synchronized void useAlternateFontforJALocales() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2877
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2878
        if (!FontUtilities.isWindows) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2879
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2880
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2881
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2882
        if (!maybeMultiAppContext()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2883
            gAltJAFont = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2884
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2885
            AppContext appContext = AppContext.getAppContext();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2886
            appContext.put(altJAFontKey, altJAFontKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2887
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2888
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2889
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2890
    public boolean usingAlternateFontforJALocales() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2891
        if (!maybeMultiAppContext()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2892
            return gAltJAFont;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2893
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2894
            AppContext appContext = AppContext.getAppContext();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2895
            return appContext.get(altJAFontKey) == altJAFontKey;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2896
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2897
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2898
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2899
    public synchronized void preferLocaleFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2900
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2901
        /* Test if re-ordering will have any effect */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2902
        if (!FontConfiguration.willReorderForStartupLocale()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2903
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2904
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2905
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2906
        if (!maybeMultiAppContext()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2907
            if (gLocalePref == true) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2908
                return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2909
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2910
            gLocalePref = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2911
            createCompositeFonts(fontNameCache, gLocalePref, gPropPref);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2912
            _usingAlternateComposites = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2913
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2914
            AppContext appContext = AppContext.getAppContext();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2915
            if (appContext.get(localeFontKey) == localeFontKey) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2916
                return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2917
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2918
            appContext.put(localeFontKey, localeFontKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2919
            boolean acPropPref =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2920
                appContext.get(proportionalFontKey) == proportionalFontKey;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2921
            ConcurrentHashMap<String, Font2D>
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2922
                altNameCache = new ConcurrentHashMap<String, Font2D> ();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2923
            /* If there is an existing hashtable, we can drop it. */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2924
            appContext.put(CompositeFont.class, altNameCache);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2925
            _usingPerAppContextComposites = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2926
            createCompositeFonts(altNameCache, true, acPropPref);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2927
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2928
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2930
    public synchronized void preferProportionalFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2931
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2932
        /* If no proportional fonts are configured, there's no need
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2933
         * to take any action.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2934
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2935
        if (!FontConfiguration.hasMonoToPropMap()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2936
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2937
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2938
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2939
        if (!maybeMultiAppContext()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2940
            if (gPropPref == true) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2941
                return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2942
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2943
            gPropPref = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2944
            createCompositeFonts(fontNameCache, gLocalePref, gPropPref);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2945
            _usingAlternateComposites = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2946
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2947
            AppContext appContext = AppContext.getAppContext();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2948
            if (appContext.get(proportionalFontKey) == proportionalFontKey) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2949
                return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2950
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2951
            appContext.put(proportionalFontKey, proportionalFontKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2952
            boolean acLocalePref =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2953
                appContext.get(localeFontKey) == localeFontKey;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2954
            ConcurrentHashMap<String, Font2D>
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2955
                altNameCache = new ConcurrentHashMap<String, Font2D> ();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2956
            /* If there is an existing hashtable, we can drop it. */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2957
            appContext.put(CompositeFont.class, altNameCache);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2958
            _usingPerAppContextComposites = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2959
            createCompositeFonts(altNameCache, acLocalePref, true);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2960
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2961
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2962
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2963
    private static HashSet<String> installedNames = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2964
    private static HashSet<String> getInstalledNames() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2965
        if (installedNames == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2966
           Locale l = getSystemStartupLocale();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2967
           SunFontManager fontManager = SunFontManager.getInstance();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2968
           String[] installedFamilies =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2969
               fontManager.getInstalledFontFamilyNames(l);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2970
           Font[] installedFonts = fontManager.getAllInstalledFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2971
           HashSet<String> names = new HashSet<String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2972
           for (int i=0; i<installedFamilies.length; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2973
               names.add(installedFamilies[i].toLowerCase(l));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2974
           }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2975
           for (int i=0; i<installedFonts.length; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2976
               names.add(installedFonts[i].getFontName(l).toLowerCase(l));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2977
           }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2978
           installedNames = names;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2979
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2980
        return installedNames;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2981
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2982
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2983
    /* Keys are used to lookup per-AppContext Hashtables */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2984
    private static final Object regFamilyKey  = new Object();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2985
    private static final Object regFullNameKey = new Object();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2986
    private Hashtable<String,FontFamily> createdByFamilyName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2987
    private Hashtable<String,Font2D>     createdByFullName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2988
    private boolean fontsAreRegistered = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2989
    private boolean fontsAreRegisteredPerAppContext = false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2990
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2991
    public boolean registerFont(Font font) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2992
        /* This method should not be called with "null".
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2993
         * It is the caller's responsibility to ensure that.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2994
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2995
        if (font == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2996
            return false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2997
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2998
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  2999
        /* Initialise these objects only once we start to use this API */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3000
        synchronized (regFamilyKey) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3001
            if (createdByFamilyName == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3002
                createdByFamilyName = new Hashtable<String,FontFamily>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3003
                createdByFullName = new Hashtable<String,Font2D>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3004
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3005
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3006
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3007
        if (! FontAccess.getFontAccess().isCreatedFont(font)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3008
            return false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3009
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3010
        /* We want to ensure that this font cannot override existing
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3011
         * installed fonts. Check these conditions :
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3012
         * - family name is not that of an installed font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3013
         * - full name is not that of an installed font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3014
         * - family name is not the same as the full name of an installed font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3015
         * - full name is not the same as the family name of an installed font
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3016
         * The last two of these may initially look odd but the reason is
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3017
         * that (unfortunately) Font constructors do not distinuguish these.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3018
         * An extreme example of such a problem would be a font which has
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3019
         * family name "Dialog.Plain" and full name of "Dialog".
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3020
         * The one arguably overly stringent restriction here is that if an
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3021
         * application wants to supply a new member of an existing family
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3022
         * It will get rejected. But since the JRE can perform synthetic
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3023
         * styling in many cases its not necessary.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3024
         * We don't apply the same logic to registered fonts. If apps want
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3025
         * to do this lets assume they have a reason. It won't cause problems
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3026
         * except for themselves.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3027
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3028
        HashSet<String> names = getInstalledNames();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3029
        Locale l = getSystemStartupLocale();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3030
        String familyName = font.getFamily(l).toLowerCase();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3031
        String fullName = font.getFontName(l).toLowerCase();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3032
        if (names.contains(familyName) || names.contains(fullName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3033
            return false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3034
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3035
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3036
        /* Checks passed, now register the font */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3037
        Hashtable<String,FontFamily> familyTable;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3038
        Hashtable<String,Font2D> fullNameTable;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3039
        if (!maybeMultiAppContext()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3040
            familyTable = createdByFamilyName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3041
            fullNameTable = createdByFullName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3042
            fontsAreRegistered = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3043
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3044
            AppContext appContext = AppContext.getAppContext();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3045
            familyTable =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3046
                (Hashtable<String,FontFamily>)appContext.get(regFamilyKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3047
            fullNameTable =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3048
                (Hashtable<String,Font2D>)appContext.get(regFullNameKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3049
            if (familyTable == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3050
                familyTable = new Hashtable<String,FontFamily>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3051
                fullNameTable = new Hashtable<String,Font2D>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3052
                appContext.put(regFamilyKey, familyTable);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3053
                appContext.put(regFullNameKey, fullNameTable);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3054
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3055
            fontsAreRegisteredPerAppContext = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3056
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3057
        /* Create the FontFamily and add font to the tables */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3058
        Font2D font2D = FontUtilities.getFont2D(font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3059
        int style = font2D.getStyle();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3060
        FontFamily family = familyTable.get(familyName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3061
        if (family == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3062
            family = new FontFamily(font.getFamily(l));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3063
            familyTable.put(familyName, family);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3064
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3065
        /* Remove name cache entries if not using app contexts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3066
         * To accommodate a case where code may have registered first a plain
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3067
         * family member and then used it and is now registering a bold family
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3068
         * member, we need to remove all members of the family, so that the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3069
         * new style can get picked up rather than continuing to synthesise.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3070
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3071
        if (fontsAreRegistered) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3072
            removeFromCache(family.getFont(Font.PLAIN));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3073
            removeFromCache(family.getFont(Font.BOLD));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3074
            removeFromCache(family.getFont(Font.ITALIC));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3075
            removeFromCache(family.getFont(Font.BOLD|Font.ITALIC));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3076
            removeFromCache(fullNameTable.get(fullName));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3077
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3078
        family.setFont(font2D, style);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3079
        fullNameTable.put(fullName, font2D);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3080
        return true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3081
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3082
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3083
    /* Remove from the name cache all references to the Font2D */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3084
    private void removeFromCache(Font2D font) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3085
        if (font == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3086
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3087
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3088
        String[] keys = (String[])(fontNameCache.keySet().toArray(STR_ARRAY));
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3089
        for (int k=0; k<keys.length;k++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3090
            if (fontNameCache.get(keys[k]) == font) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3091
                fontNameCache.remove(keys[k]);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3092
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3093
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3094
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3095
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3096
    // It may look odd to use TreeMap but its more convenient to the caller.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3097
    public TreeMap<String, String> getCreatedFontFamilyNames() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3098
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3099
        Hashtable<String,FontFamily> familyTable;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3100
        if (fontsAreRegistered) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3101
            familyTable = createdByFamilyName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3102
        } else if (fontsAreRegisteredPerAppContext) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3103
            AppContext appContext = AppContext.getAppContext();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3104
            familyTable =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3105
                (Hashtable<String,FontFamily>)appContext.get(regFamilyKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3106
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3107
            return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3108
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3109
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3110
        Locale l = getSystemStartupLocale();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3111
        synchronized (familyTable) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3112
            TreeMap<String, String> map = new TreeMap<String, String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3113
            for (FontFamily f : familyTable.values()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3114
                Font2D font2D = f.getFont(Font.PLAIN);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3115
                if (font2D == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3116
                    font2D = f.getClosestStyle(Font.PLAIN);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3117
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3118
                String name = font2D.getFamilyName(l);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3119
                map.put(name.toLowerCase(l), name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3120
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3121
            return map;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3122
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3123
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3124
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3125
    public Font[] getCreatedFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3126
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3127
        Hashtable<String,Font2D> nameTable;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3128
        if (fontsAreRegistered) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3129
            nameTable = createdByFullName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3130
        } else if (fontsAreRegisteredPerAppContext) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3131
            AppContext appContext = AppContext.getAppContext();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3132
            nameTable =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3133
                (Hashtable<String,Font2D>)appContext.get(regFullNameKey);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3134
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3135
            return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3136
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3137
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3138
        Locale l = getSystemStartupLocale();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3139
        synchronized (nameTable) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3140
            Font[] fonts = new Font[nameTable.size()];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3141
            int i=0;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3142
            for (Font2D font2D : nameTable.values()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3143
                fonts[i++] = new Font(font2D.getFontName(l), Font.PLAIN, 1);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3144
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3145
            return fonts;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3146
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3147
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3148
7950
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  3149
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3150
    protected String[] getPlatformFontDirs(boolean noType1Fonts) {
7950
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  3151
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  3152
        /* First check if we already initialised path dirs */
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  3153
        if (pathDirs != null) {
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  3154
            return pathDirs;
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  3155
        }
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  3156
7944
26b96bf47c49 6983037: closed/java/awt/font/FontNames/Type1Fonts.java failed due to missed font
prr
parents: 7937
diff changeset
  3157
        String path = getPlatformFontPath(noType1Fonts);
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3158
        StringTokenizer parser =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3159
            new StringTokenizer(path, File.pathSeparator);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3160
        ArrayList<String> pathList = new ArrayList<String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3161
        try {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3162
            while (parser.hasMoreTokens()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3163
                pathList.add(parser.nextToken());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3164
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3165
        } catch (NoSuchElementException e) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3166
        }
7950
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  3167
        pathDirs = pathList.toArray(new String[0]);
dc8f97e15f9b 6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
prr
parents: 7944
diff changeset
  3168
        return pathDirs;
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3169
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3170
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3171
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3172
     * Returns an array of two strings. The first element is the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3173
     * name of the font. The second element is the file name.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3174
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3175
    public abstract String[] getDefaultPlatformFont();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3176
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3177
    // Begin: Refactored from SunGraphicsEnviroment.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3178
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3179
    /*
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3180
     * helper function for registerFonts
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3181
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3182
    private void addDirFonts(String dirName, File dirFile,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3183
                             FilenameFilter filter,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3184
                             int fontFormat, boolean useJavaRasterizer,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3185
                             int fontRank,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3186
                             boolean defer, boolean resolveSymLinks) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3187
        String[] ls = dirFile.list(filter);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3188
        if (ls == null || ls.length == 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3189
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3190
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3191
        String[] fontNames = new String[ls.length];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3192
        String[][] nativeNames = new String[ls.length][];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3193
        int fontCount = 0;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3194
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3195
        for (int i=0; i < ls.length; i++ ) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3196
            File theFile = new File(dirFile, ls[i]);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3197
            String fullName = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3198
            if (resolveSymLinks) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3199
                try {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3200
                    fullName = theFile.getCanonicalPath();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3201
                } catch (IOException e) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3202
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3203
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3204
            if (fullName == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3205
                fullName = dirName + File.separator + ls[i];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3206
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3207
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3208
            // REMIND: case compare depends on platform
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3209
            if (registeredFontFiles.contains(fullName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3210
                continue;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3211
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3212
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3213
            if (badFonts != null && badFonts.contains(fullName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3214
                if (FontUtilities.debugFonts()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3215
                    FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3216
                                         .warning("skip bad font " + fullName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3217
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3218
                continue; // skip this font file.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3219
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3220
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3221
            registeredFontFiles.add(fullName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3222
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3223
            if (FontUtilities.debugFonts()
3938
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 3929
diff changeset
  3224
                && FontUtilities.getLogger().isLoggable(PlatformLogger.INFO)) {
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3225
                String message = "Registering font " + fullName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3226
                String[] natNames = getNativeNames(fullName, null);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3227
                if (natNames == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3228
                    message += " with no native name";
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3229
                } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3230
                    message += " with native name(s) " + natNames[0];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3231
                    for (int nn = 1; nn < natNames.length; nn++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3232
                        message += ", " + natNames[nn];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3233
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3234
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3235
                FontUtilities.getLogger().info(message);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3236
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3237
            fontNames[fontCount] = fullName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3238
            nativeNames[fontCount++] = getNativeNames(fullName, null);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3239
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3240
        registerFonts(fontNames, nativeNames, fontCount, fontFormat,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3241
                         useJavaRasterizer, fontRank, defer);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3242
        return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3243
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3244
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3245
    protected String[] getNativeNames(String fontFileName,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3246
                                      String platformName) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3247
        return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3248
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3249
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3250
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3251
     * Returns a file name for the physical font represented by this platform
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3252
     * font name. The default implementation tries to obtain the file name
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3253
     * from the font configuration.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3254
     * Subclasses may override to provide information from other sources.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3255
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3256
    protected String getFileNameFromPlatformName(String platformFontName) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3257
        return fontConfig.getFileNameFromPlatformName(platformFontName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3258
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3259
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3260
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3261
     * Return the default font configuration.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3262
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3263
    public FontConfiguration getFontConfiguration() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3264
        return fontConfig;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3265
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3266
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3267
    /* A call to this method should be followed by a call to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3268
     * registerFontDirs(..)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3269
     */
7944
26b96bf47c49 6983037: closed/java/awt/font/FontNames/Type1Fonts.java failed due to missed font
prr
parents: 7937
diff changeset
  3270
    public String getPlatformFontPath(boolean noType1Font) {
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3271
        if (fontPath == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3272
            fontPath = getFontPath(noType1Font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3273
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3274
        return fontPath;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3275
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3276
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3277
    public static boolean isOpenJDK() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3278
        return FontUtilities.isOpenJDK;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3279
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3280
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3281
    protected void loadFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3282
        if (discoveredAllFonts) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3283
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3284
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3285
        /* Use lock specific to the font system */
4954
1f09a5b49505 6892485: Deadlock in SunGraphicsEnvironment / FontManager
rkennke
parents: 3938
diff changeset
  3286
        synchronized (this) {
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3287
            if (FontUtilities.debugFonts()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3288
                Thread.dumpStack();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3289
                FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3290
                            .info("SunGraphicsEnvironment.loadFonts() called");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3291
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3292
            initialiseDeferredFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3293
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3294
            java.security.AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3295
                                    new java.security.PrivilegedAction() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3296
                public Object run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3297
                    if (fontPath == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3298
                        fontPath = getPlatformFontPath(noType1Font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3299
                        registerFontDirs(fontPath);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3300
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3301
                    if (fontPath != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3302
                        // this will find all fonts including those already
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3303
                        // registered. But we have checks in place to prevent
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3304
                        // double registration.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3305
                        if (! gotFontsFromPlatform()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3306
                            registerFontsOnPath(fontPath, false,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3307
                                                Font2D.UNKNOWN_RANK,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3308
                                                false, true);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3309
                            loadedAllFontFiles = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3310
                        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3311
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3312
                    registerOtherFontFiles(registeredFontFiles);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3313
                    discoveredAllFonts = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3314
                    return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3315
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3316
            });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3317
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3318
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3319
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3320
    protected void registerFontDirs(String pathName) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3321
        return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3322
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3323
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3324
    private void registerFontsOnPath(String pathName,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3325
                                     boolean useJavaRasterizer, int fontRank,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3326
                                     boolean defer, boolean resolveSymLinks) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3327
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3328
        StringTokenizer parser = new StringTokenizer(pathName,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3329
                File.pathSeparator);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3330
        try {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3331
            while (parser.hasMoreTokens()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3332
                registerFontsInDir(parser.nextToken(),
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3333
                        useJavaRasterizer, fontRank,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3334
                        defer, resolveSymLinks);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3335
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3336
        } catch (NoSuchElementException e) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3337
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3338
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3339
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3340
    /* Called to register fall back fonts */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3341
    public void registerFontsInDir(String dirName) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3342
        registerFontsInDir(dirName, true, Font2D.JRE_RANK, true, false);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3343
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3344
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3345
    private void registerFontsInDir(String dirName, boolean useJavaRasterizer,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3346
                                    int fontRank,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3347
                                    boolean defer, boolean resolveSymLinks) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3348
        File pathFile = new File(dirName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3349
        addDirFonts(dirName, pathFile, ttFilter,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3350
                    FONTFORMAT_TRUETYPE, useJavaRasterizer,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3351
                    fontRank==Font2D.UNKNOWN_RANK ?
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3352
                    Font2D.TTF_RANK : fontRank,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3353
                    defer, resolveSymLinks);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3354
        addDirFonts(dirName, pathFile, t1Filter,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3355
                    FONTFORMAT_TYPE1, useJavaRasterizer,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3356
                    fontRank==Font2D.UNKNOWN_RANK ?
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3357
                    Font2D.TYPE1_RANK : fontRank,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3358
                    defer, resolveSymLinks);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3359
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3360
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3361
    protected void registerFontDir(String path) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3362
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3363
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3364
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3365
     * Returns file name for default font, either absolute
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3366
     * or relative as needed by registerFontFile.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3367
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3368
    public synchronized String getDefaultFontFile() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3369
        if (defaultFontFileName == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3370
            initDefaultFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3371
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3372
        return defaultFontFileName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3373
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3374
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3375
    private void initDefaultFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3376
        if (!isOpenJDK()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3377
            defaultFontName = lucidaFontName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3378
            if (useAbsoluteFontFileNames()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3379
                defaultFontFileName =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3380
                    jreFontDirName + File.separator + FontUtilities.LUCIDA_FILE_NAME;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3381
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3382
                defaultFontFileName = FontUtilities.LUCIDA_FILE_NAME;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3383
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3384
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3385
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3386
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3387
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3388
     * Whether registerFontFile expects absolute or relative
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3389
     * font file names.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3390
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3391
    protected boolean useAbsoluteFontFileNames() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3392
        return true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3393
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3394
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3395
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3396
     * Creates this environment's FontConfiguration.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3397
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3398
    protected abstract FontConfiguration createFontConfiguration();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3399
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3400
    public abstract FontConfiguration
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3401
    createFontConfiguration(boolean preferLocaleFonts,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3402
                            boolean preferPropFonts);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3403
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3404
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3405
     * Returns face name for default font, or null if
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3406
     * no face names are used for CompositeFontDescriptors
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3407
     * for this platform.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3408
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3409
    public synchronized String getDefaultFontFaceName() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3410
        if (defaultFontName == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3411
            initDefaultFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3412
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3413
        return defaultFontName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3414
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3415
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3416
    public void loadFontFiles() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3417
        loadFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3418
        if (loadedAllFontFiles) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3419
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3420
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3421
        /* Use lock specific to the font system */
4954
1f09a5b49505 6892485: Deadlock in SunGraphicsEnvironment / FontManager
rkennke
parents: 3938
diff changeset
  3422
        synchronized (this) {
3929
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3423
            if (FontUtilities.debugFonts()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3424
                Thread.dumpStack();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3425
                FontUtilities.getLogger().info("loadAllFontFiles() called");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3426
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3427
            java.security.AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3428
                                    new java.security.PrivilegedAction() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3429
                public Object run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3430
                    if (fontPath == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3431
                        fontPath = getPlatformFontPath(noType1Font);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3432
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3433
                    if (fontPath != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3434
                        // this will find all fonts including those already
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3435
                        // registered. But we have checks in place to prevent
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3436
                        // double registration.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3437
                        registerFontsOnPath(fontPath, false,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3438
                                            Font2D.UNKNOWN_RANK,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3439
                                            false, true);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3440
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3441
                    loadedAllFontFiles = true;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3442
                    return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3443
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3444
            });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3445
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3446
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3447
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3448
    /*
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3449
     * This method asks the font configuration API for all platform names
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3450
     * used as components of composite/logical fonts and iterates over these
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3451
     * looking up their corresponding file name and registers these fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3452
     * It also ensures that the fonts are accessible via platform APIs.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3453
     * The composites themselves are then registered.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3454
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3455
    private void
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3456
        initCompositeFonts(FontConfiguration fontConfig,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3457
                           ConcurrentHashMap<String, Font2D>  altNameCache) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3458
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3459
        int numCoreFonts = fontConfig.getNumberCoreFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3460
        String[] fcFonts = fontConfig.getPlatformFontNames();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3461
        for (int f=0; f<fcFonts.length; f++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3462
            String platformFontName = fcFonts[f];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3463
            String fontFileName =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3464
                getFileNameFromPlatformName(platformFontName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3465
            String[] nativeNames = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3466
            if (fontFileName == null
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3467
                || fontFileName.equals(platformFontName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3468
                /* No file located, so register using the platform name,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3469
                 * i.e. as a native font.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3470
                 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3471
                fontFileName = platformFontName;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3472
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3473
                if (f < numCoreFonts) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3474
                    /* If platform APIs also need to access the font, add it
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3475
                     * to a set to be registered with the platform too.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3476
                     * This may be used to add the parent directory to the X11
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3477
                     * font path if its not already there. See the docs for the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3478
                     * subclass implementation.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3479
                     * This is now mainly for the benefit of X11-based AWT
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3480
                     * But for historical reasons, 2D initialisation code
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3481
                     * makes these calls.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3482
                     * If the fontconfiguration file is properly set up
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3483
                     * so that all fonts are mapped to files and all their
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3484
                     * appropriate directories are specified, then this
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3485
                     * method will be low cost as it will return after
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3486
                     * a test that finds a null lookup map.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3487
                     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3488
                    addFontToPlatformFontPath(platformFontName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3489
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3490
                nativeNames = getNativeNames(fontFileName, platformFontName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3491
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3492
            /* Uncomment these two lines to "generate" the XLFD->filename
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3493
             * mappings needed to speed start-up on Solaris.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3494
             * Augment this with the appendedpathname and the mappings
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3495
             * for native (F3) fonts
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3496
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3497
            //String platName = platformFontName.replaceAll(" ", "_");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3498
            //System.out.println("filename."+platName+"="+fontFileName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3499
            registerFontFile(fontFileName, nativeNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3500
                             Font2D.FONT_CONFIG_RANK, true);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3501
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3502
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3503
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3504
        /* This registers accumulated paths from the calls to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3505
         * addFontToPlatformFontPath(..) and any specified by
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3506
         * the font configuration. Rather than registering
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3507
         * the fonts it puts them in a place and form suitable for
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3508
         * the Toolkit to pick up and use if a toolkit is initialised,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3509
         * and if it uses X11 fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3510
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3511
        registerPlatformFontsUsedByFontConfiguration();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3512
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3513
        CompositeFontDescriptor[] compositeFontInfo
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3514
                = fontConfig.get2DCompositeFontInfo();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3515
        for (int i = 0; i < compositeFontInfo.length; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3516
            CompositeFontDescriptor descriptor = compositeFontInfo[i];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3517
            String[] componentFileNames = descriptor.getComponentFileNames();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3518
            String[] componentFaceNames = descriptor.getComponentFaceNames();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3519
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3520
            /* It would be better eventually to handle this in the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3521
             * FontConfiguration code which should also remove duplicate slots
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3522
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3523
            if (missingFontFiles != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3524
                for (int ii=0; ii<componentFileNames.length; ii++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3525
                    if (missingFontFiles.contains(componentFileNames[ii])) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3526
                        componentFileNames[ii] = getDefaultFontFile();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3527
                        componentFaceNames[ii] = getDefaultFontFaceName();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3528
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3529
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3530
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3531
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3532
            /* FontConfiguration needs to convey how many fonts it has added
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3533
             * as fallback component fonts which should not affect metrics.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3534
             * The core component count will be the number of metrics slots.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3535
             * This does not preclude other mechanisms for adding
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3536
             * fall back component fonts to the composite.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3537
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3538
            if (altNameCache != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3539
                SunFontManager.registerCompositeFont(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3540
                    descriptor.getFaceName(),
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3541
                    componentFileNames, componentFaceNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3542
                    descriptor.getCoreComponentCount(),
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3543
                    descriptor.getExclusionRanges(),
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3544
                    descriptor.getExclusionRangeLimits(),
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3545
                    true,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3546
                    altNameCache);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3547
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3548
                registerCompositeFont(descriptor.getFaceName(),
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3549
                                      componentFileNames, componentFaceNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3550
                                      descriptor.getCoreComponentCount(),
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3551
                                      descriptor.getExclusionRanges(),
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3552
                                      descriptor.getExclusionRangeLimits(),
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3553
                                      true);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3554
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3555
            if (FontUtilities.debugFonts()) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3556
                FontUtilities.getLogger()
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3557
                               .info("registered " + descriptor.getFaceName());
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3558
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3559
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3560
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3561
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3562
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3563
     * Notifies graphics environment that the logical font configuration
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3564
     * uses the given platform font name. The graphics environment may
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3565
     * use this for platform specific initialization.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3566
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3567
    protected void addFontToPlatformFontPath(String platformFontName) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3568
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3569
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3570
    protected void registerFontFile(String fontFileName, String[] nativeNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3571
                                    int fontRank, boolean defer) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3572
//      REMIND: case compare depends on platform
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3573
        if (registeredFontFiles.contains(fontFileName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3574
            return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3575
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3576
        int fontFormat;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3577
        if (ttFilter.accept(null, fontFileName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3578
            fontFormat = FONTFORMAT_TRUETYPE;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3579
        } else if (t1Filter.accept(null, fontFileName)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3580
            fontFormat = FONTFORMAT_TYPE1;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3581
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3582
            fontFormat = FONTFORMAT_NATIVE;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3583
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3584
        registeredFontFiles.add(fontFileName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3585
        if (defer) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3586
            registerDeferredFont(fontFileName, fontFileName, nativeNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3587
                                 fontFormat, false, fontRank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3588
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3589
            registerFontFile(fontFileName, nativeNames, fontFormat, false,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3590
                             fontRank);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3591
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3592
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3593
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3594
    protected void registerPlatformFontsUsedByFontConfiguration() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3595
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3596
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3597
    /*
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3598
     * A GE may verify whether a font file used in a fontconfiguration
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3599
     * exists. If it doesn't then either we may substitute the default
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3600
     * font, or perhaps elide it altogether from the composite font.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3601
     * This makes some sense on windows where the font file is only
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3602
     * likely to be in one place. But on other OSes, eg Linux, the file
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3603
     * can move around depending. So there we probably don't want to assume
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3604
     * its missing and so won't add it to this list.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3605
     * If this list - missingFontFiles - is non-null then the composite
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3606
     * font initialisation logic tests to see if a font file is in that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3607
     * set.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3608
     * Only one thread should be able to add to this set so we don't
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3609
     * synchronize.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3610
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3611
    protected void addToMissingFontFileList(String fileName) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3612
        if (missingFontFiles == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3613
            missingFontFiles = new HashSet<String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3614
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3615
        missingFontFiles.add(fileName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3616
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3617
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3618
    /*
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3619
     * This is for use only within getAllFonts().
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3620
     * Fonts listed in the fontconfig files for windows were all
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3621
     * on the "deferred" initialisation list. They were registered
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3622
     * either in the course of the application, or in the call to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3623
     * loadFonts() within getAllFonts(). The fontconfig file specifies
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3624
     * the names of the fonts using the English names. If there's a
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3625
     * different name in the execution locale, then the platform will
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3626
     * report that, and we will construct the font with both names, and
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3627
     * thereby enumerate it twice. This happens for Japanese fonts listed
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3628
     * in the windows fontconfig, when run in the JA locale. The solution
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3629
     * is to rely (in this case) on the platform's font->file mapping to
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3630
     * determine that this name corresponds to a file we already registered.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3631
     * This works because
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3632
     * - we know when we get here all deferred fonts are already initialised
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3633
     * - when we register a font file, we register all fonts in it.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3634
     * - we know the fontconfig fonts are all in the windows registry
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3635
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3636
    private boolean isNameForRegisteredFile(String fontName) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3637
        String fileName = getFileNameForFontName(fontName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3638
        if (fileName == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3639
            return false;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3640
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3641
        return registeredFontFiles.contains(fileName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3642
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3643
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3644
    /*
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3645
     * This invocation is not in a privileged block because
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3646
     * all privileged operations (reading files and properties)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3647
     * was conducted on the creation of the GE
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3648
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3649
    public void
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3650
        createCompositeFonts(ConcurrentHashMap<String, Font2D> altNameCache,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3651
                             boolean preferLocale,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3652
                             boolean preferProportional) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3653
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3654
        FontConfiguration fontConfig =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3655
            createFontConfiguration(preferLocale, preferProportional);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3656
        initCompositeFonts(fontConfig, altNameCache);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3657
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3658
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3659
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3660
     * Returns all fonts installed in this environment.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3661
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3662
    public Font[] getAllInstalledFonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3663
        if (allFonts == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3664
            loadFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3665
            TreeMap fontMapNames = new TreeMap();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3666
            /* warning: the number of composite fonts could change dynamically
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3667
             * if applications are allowed to create them. "allfonts" could
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3668
             * then be stale.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3669
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3670
            Font2D[] allfonts = getRegisteredFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3671
            for (int i=0; i < allfonts.length; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3672
                if (!(allfonts[i] instanceof NativeFont)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3673
                    fontMapNames.put(allfonts[i].getFontName(null),
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3674
                                     allfonts[i]);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3675
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3676
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3677
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3678
            String[] platformNames = getFontNamesFromPlatform();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3679
            if (platformNames != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3680
                for (int i=0; i<platformNames.length; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3681
                    if (!isNameForRegisteredFile(platformNames[i])) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3682
                        fontMapNames.put(platformNames[i], null);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3683
                    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3684
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3685
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3686
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3687
            String[] fontNames = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3688
            if (fontMapNames.size() > 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3689
                fontNames = new String[fontMapNames.size()];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3690
                Object [] keyNames = fontMapNames.keySet().toArray();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3691
                for (int i=0; i < keyNames.length; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3692
                    fontNames[i] = (String)keyNames[i];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3693
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3694
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3695
            Font[] fonts = new Font[fontNames.length];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3696
            for (int i=0; i < fontNames.length; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3697
                fonts[i] = new Font(fontNames[i], Font.PLAIN, 1);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3698
                Font2D f2d = (Font2D)fontMapNames.get(fontNames[i]);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3699
                if (f2d  != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3700
                    FontAccess.getFontAccess().setFont2D(fonts[i], f2d.handle);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3701
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3702
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3703
            allFonts = fonts;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3704
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3705
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3706
        Font []copyFonts = new Font[allFonts.length];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3707
        System.arraycopy(allFonts, 0, copyFonts, 0, allFonts.length);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3708
        return copyFonts;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3709
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3710
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3711
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3712
     * Get a list of installed fonts in the requested {@link Locale}.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3713
     * The list contains the fonts Family Names.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3714
     * If Locale is null, the default locale is used.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3715
     *
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3716
     * @param requestedLocale, if null the default locale is used.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3717
     * @return list of installed fonts in the system.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3718
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3719
    public String[] getInstalledFontFamilyNames(Locale requestedLocale) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3720
        if (requestedLocale == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3721
            requestedLocale = Locale.getDefault();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3722
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3723
        if (allFamilies != null && lastDefaultLocale != null &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3724
            requestedLocale.equals(lastDefaultLocale)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3725
                String[] copyFamilies = new String[allFamilies.length];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3726
                System.arraycopy(allFamilies, 0, copyFamilies,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3727
                                 0, allFamilies.length);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3728
                return copyFamilies;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3729
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3730
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3731
        TreeMap<String,String> familyNames = new TreeMap<String,String>();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3732
        //  these names are always there and aren't localised
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3733
        String str;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3734
        str = Font.SERIF;         familyNames.put(str.toLowerCase(), str);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3735
        str = Font.SANS_SERIF;    familyNames.put(str.toLowerCase(), str);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3736
        str = Font.MONOSPACED;    familyNames.put(str.toLowerCase(), str);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3737
        str = Font.DIALOG;        familyNames.put(str.toLowerCase(), str);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3738
        str = Font.DIALOG_INPUT;  familyNames.put(str.toLowerCase(), str);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3739
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3740
        /* Platform APIs may be used to get the set of available family
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3741
         * names for the current default locale so long as it is the same
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3742
         * as the start-up system locale, rather than loading all fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3743
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3744
        if (requestedLocale.equals(getSystemStartupLocale()) &&
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3745
            getFamilyNamesFromPlatform(familyNames, requestedLocale)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3746
            /* Augment platform names with JRE font family names */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3747
            getJREFontFamilyNames(familyNames, requestedLocale);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3748
        } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3749
            loadFontFiles();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3750
            Font2D[] physicalfonts = getPhysicalFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3751
            for (int i=0; i < physicalfonts.length; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3752
                if (!(physicalfonts[i] instanceof NativeFont)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3753
                    String name =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3754
                        physicalfonts[i].getFamilyName(requestedLocale);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3755
                    familyNames.put(name.toLowerCase(requestedLocale), name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3756
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3757
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3758
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3759
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3760
        String[] retval =  new String[familyNames.size()];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3761
        Object [] keyNames = familyNames.keySet().toArray();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3762
        for (int i=0; i < keyNames.length; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3763
            retval[i] = (String)familyNames.get(keyNames[i]);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3764
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3765
        if (requestedLocale.equals(Locale.getDefault())) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3766
            lastDefaultLocale = requestedLocale;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3767
            allFamilies = new String[retval.length];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3768
            System.arraycopy(retval, 0, allFamilies, 0, allFamilies.length);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3769
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3770
        return retval;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3771
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3772
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3773
    public void register1dot0Fonts() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3774
        java.security.AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3775
                            new java.security.PrivilegedAction() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3776
            public Object run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3777
                String type1Dir = "/usr/openwin/lib/X11/fonts/Type1";
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3778
                registerFontsInDir(type1Dir, true, Font2D.TYPE1_RANK,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3779
                                   false, false);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3780
                return null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3781
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3782
        });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3783
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3784
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3785
    /* Really we need only the JRE fonts family names, but there's little
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3786
     * overhead in doing this the easy way by adding all the currently
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3787
     * known fonts.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3788
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3789
    protected void getJREFontFamilyNames(TreeMap<String,String> familyNames,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3790
                                         Locale requestedLocale) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3791
        registerDeferredJREFonts(jreFontDirName);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3792
        Font2D[] physicalfonts = getPhysicalFonts();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3793
        for (int i=0; i < physicalfonts.length; i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3794
            if (!(physicalfonts[i] instanceof NativeFont)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3795
                String name =
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3796
                    physicalfonts[i].getFamilyName(requestedLocale);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3797
                familyNames.put(name.toLowerCase(requestedLocale), name);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3798
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3799
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3800
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3801
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3802
    /**
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3803
     * Default locale can be changed but we need to know the initial locale
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3804
     * as that is what is used by native code. Changing Java default locale
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3805
     * doesn't affect that.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3806
     * Returns the locale in use when using native code to communicate
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3807
     * with platform APIs. On windows this is known as the "system" locale,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3808
     * and it is usually the same as the platform locale, but not always,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3809
     * so this method also checks an implementation property used only
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3810
     * on windows and uses that if set.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3811
     */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3812
    private static Locale systemLocale = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3813
    private static Locale getSystemStartupLocale() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3814
        if (systemLocale == null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3815
            systemLocale = (Locale)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3816
                java.security.AccessController.doPrivileged(
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3817
                                    new java.security.PrivilegedAction() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3818
            public Object run() {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3819
                /* On windows the system locale may be different than the
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3820
                 * user locale. This is an unsupported configuration, but
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3821
                 * in that case we want to return a dummy locale that will
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3822
                 * never cause a match in the usage of this API. This is
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3823
                 * important because Windows documents that the family
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3824
                 * names of fonts are enumerated using the language of
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3825
                 * the system locale. BY returning a dummy locale in that
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3826
                 * case we do not use the platform API which would not
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3827
                 * return us the names we want.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3828
                 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3829
                String fileEncoding = System.getProperty("file.encoding", "");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3830
                String sysEncoding = System.getProperty("sun.jnu.encoding");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3831
                if (sysEncoding != null && !sysEncoding.equals(fileEncoding)) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3832
                    return Locale.ROOT;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3833
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3834
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3835
                String language = System.getProperty("user.language", "en");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3836
                String country  = System.getProperty("user.country","");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3837
                String variant  = System.getProperty("user.variant","");
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3838
                return new Locale(language, country, variant);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3839
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3840
        });
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3841
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3842
        return systemLocale;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3843
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3844
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3845
    void addToPool(FileFont font) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3846
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3847
        FileFont fontFileToClose = null;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3848
        int freeSlot = -1;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3849
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3850
        synchronized (fontFileCache) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3851
            /* Avoid duplicate entries in the pool, and don't close() it,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3852
             * since this method is called only from within open().
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3853
             * Seeing a duplicate is most likely to happen if the thread
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3854
             * was interrupted during a read, forcing perhaps repeated
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3855
             * close and open calls and it eventually it ends up pointing
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3856
             * at the same slot.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3857
             */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3858
            for (int i=0;i<CHANNELPOOLSIZE;i++) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3859
                if (fontFileCache[i] == font) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3860
                    return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3861
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3862
                if (fontFileCache[i] == null && freeSlot < 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3863
                    freeSlot = i;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3864
                }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3865
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3866
            if (freeSlot >= 0) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3867
                fontFileCache[freeSlot] = font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3868
                return;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3869
            } else {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3870
                /* replace with new font. */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3871
                fontFileToClose = fontFileCache[lastPoolIndex];
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3872
                fontFileCache[lastPoolIndex] = font;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3873
                /* lastPoolIndex is updated so that the least recently opened
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3874
                 * file will be closed next.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3875
                 */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3876
                lastPoolIndex = (lastPoolIndex+1) % CHANNELPOOLSIZE;
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3877
            }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3878
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3879
        /* Need to close the font file outside of the synchronized block,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3880
         * since its possible some other thread is in an open() call on
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3881
         * this font file, and could be holding its lock and the pool lock.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3882
         * Releasing the pool lock allows that thread to continue, so it can
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3883
         * then release the lock on this font, allowing the close() call
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3884
         * below to proceed.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3885
         * Also, calling close() is safe because any other thread using
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3886
         * the font we are closing() synchronizes all reading, so we
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3887
         * will not close the file while its in use.
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3888
         */
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3889
        if (fontFileToClose != null) {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3890
            fontFileToClose.close();
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3891
        }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3892
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3893
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3894
    protected FontUIResource getFontConfigFUIR(String family, int style,
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3895
                                               int size)
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3896
    {
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3897
        return new FontUIResource(family, style, size);
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3898
    }
de1a48b7aa41 6869705: Missing files of CR6795908, FontManager refactoring
rkennke
parents:
diff changeset
  3899
}