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