fontpath.c revision 4063
553N/A * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 0N/A * published by the Free Software Foundation. Oracle designates this 0N/A * particular file as subject to the "Classpath" exception as provided 0N/A * by Oracle in the LICENSE file that accompanied this code. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 553N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 553N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA /* Locate fonts directories relative to the Windows System directory. * If Windows System location is different than the user's window * directory location, as in a shared Windows installation, * return both locations as potential font directories /* The code below is used to obtain information from the windows font APIS * and registry on which fonts are available and what font files hold those * fonts. The results are used to speed font lookup. /* IS_NT means NT or later OSes which support Unicode. * We have to painfully deal with the ASCII and non-ASCII case we * we really want to get the font names as unicode wherever possible. * UNICODE_OS is 0 to mean uninitialised, 1 to mean not a unicode OS, * 2 to mean a unicode OS. /* NT is W2K & XP. WIN is Win9x */ "Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts";
"Software\\Microsoft\\Windows\\CurrentVersion\\Fonts";
/* Callback for call to EnumFontFamiliesEx in the EnumFamilyNames function. * Expects to be called once for each face name in the family specified * in the call. We extract the full name for the font which is expected * to be in the "system encoding" and create canonical and lower case * Java strings for the name which are added to the maps. The lower case * name is used as key to the family name value in the font to family map, * the canonical name is one of the"list" of members of the family. /* Both Vista and XP return DEVICE_FONTTYPE for OTF fonts */ /* printf("FULL=%s\n",lpelfe->elfFullName);fflush(stdout); */ /* if (!info->isDifferent) { */ /* wprintf(LFor font %s expected family=%s instead got %s\n", */ /* lpelfe->elfFullName, */ /* lpelfe->elfLogFont.lfFaceName); */ /* If fullName can't be stored in the struct, assume correct family */ /* Both Vista and XP return DEVICE_FONTTYPE for OTF fonts */ /* Windows has font aliases and so may enumerate fonts from * the aliased family if any actual font of that family is installed. * To protect against it ignore fonts which aren't enumerated under /* Callback for EnumFontFamiliesEx in populateFontFileNameMap. * Expects to be called for every charset of every font family. * If this is the first time we have been called for this family, * add a new mapping to the familyToFontListMap from this family to a * list of its members. To populate that list, further enumerate all faces * in this family for the matched charset. This assumes that all fonts * in a family support the same charset, which is a fairly safe assumption * and saves time as the call we make here to EnumFontFamiliesEx will * enumerate the members of this family just once each. * Because we set fmi->list to be the newly created list the call back * can safely add to that list without a search. /* Both Vista and XP return DEVICE_FONTTYPE for OTF fonts */ /* Windows lists fonts which have a vmtx (vertical metrics) table twice. * Once using their normal name, and again preceded by '@'. These appear * in font lists in some windows apps, such as wordpad. We don't want * these so we skip any font where the first character is '@' /* check if already seen this family with a different charset */ /* printf("FAMILY=%s\n", lpelfe->elfLogFont.lfFaceName);fflush(stdout); */ /* Both Vista and XP return DEVICE_FONTTYPE for OTF fonts */ /* wprintf(L"FAMILY=%s charset=%d FULL=%s\n", */ /* lpelfe->elfLogFont.lfFaceName, */ /* lpelfe->elfLogFont.lfCharSet, */ /* lpelfe->elfFullName); */ /* Windows lists fonts which have a vmtx (vertical metrics) table twice. * Once using their normal name, and again preceded by '@'. These appear * in font lists in some windows apps, such as wordpad. We don't want * these so we skip any font where the first character is '@' /* check if already seen this family with a different charset */ /* It looks like TrueType fonts have " (TrueType)" tacked on the end of their * name, so we can try to use that to distinguish TT from other fonts. * However if a program "installed" a font in the registry the key may * not include that. We could also try to "pass" fonts which have no "(..)" * at the end. But that turns out to pass a few .FON files that MS supply. * If there's no parenthesised type string, we could next try to infer * the file type from the file name extension. Since the MS entries that * have no type string are very few, and have odd names like "MS-DOS CP 437" * and would never return a Java Font anyway its currently OK to put these * in the font map, although clearly the returned names must never percolate * up into a list of available fonts returned to the application. * Additionally for TTC font files the key looks like * Font 1 & Font 2 (TrueType) * Font 1 & Font 2 & Font 3 (TrueType) * Also if a Font has a name for this locale that name also * exists in the registry using the appropriate platform encoding. * Note: OpenType fonts seems to have " (TrueType)" suffix on Vista * but " (OpenType)" on XP. static const char TTSUFFIX[] =
" (TrueType)";
static const char OTSUFFIX[] =
" (OpenType)";
/* suffix length is the same for truetype and opentype fonts */ suffix[0] =
'\0';
/* truncate name */ /* suffix length is the same for truetype and opentype fonts */ suffix[0] = L
'\0';
/* truncate name */ /* TTC or ttc means it may be a collection. Need to parse out * multiple font face names separated by " & " * By only doing this for fonts which look like collections based on * file name we are adhering to MS recommendations for font file names * so it seems that we can be sure that this identifies precisely * the MS-supplied truetype collections. * This avoids any potential issues if a TTF file happens to have * a & in the font name (I can't find anything which prohibits this) * and also means we only parse the key in cases we know to be while (
ptr1 >=
name) {
/* marginally safer than while (true) */ /* TTC or ttc means it may be a collection. Need to parse out * multiple font face names separated by " & " * By only doing this for fonts which look like collections based on * file name we are adhering to MS recommendations for font file names * so it seems that we can be sure that this identifies precisely * the MS-supplied truetype collections. * This avoids any potential issues if a TTF file happens to have * a & in the font name (I can't find anything which prohibits this) * and also means we only parse the key in cases we know to be while (
ptr1 >=
name) {
/* marginally safer than while (true) */ /* Obtain all the fontname -> filename mappings. * This is called once and the results returned to Java code which can * use it for lookups to reduce or avoid the need to search font files. /* Check we were passed all the maps we need, and do lookup of * methods for JNI up-calls /* Enumerate fonts via GDI to build maps of fonts and families */ /* Use the windows registry to map font names to files */ if (
type !=
REG_SZ) {
/* REG_SZ means a null-terminated string */ /* If the filename ends with ".ttf" or ".otf" also accept it. * Not expecting to need to do this for .ttc files. * Also note this code is not mirrored in the "A" (win9x) path. continue;
/* not a TT font... */ continue;
/* not a TT font... */