Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
4115bd36
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
4115bd36
编写于
1月 21, 2011
作者:
P
prr
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6892138: Windows GDI platform font lookup apis affect start-up for small UI apps
Reviewed-by: igor, jgodinez
上级
10ef170b
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
363 addition
and
1 deletion
+363
-1
src/share/classes/sun/font/SunFontManager.java
src/share/classes/sun/font/SunFontManager.java
+221
-1
src/windows/classes/sun/awt/Win32FontManager.java
src/windows/classes/sun/awt/Win32FontManager.java
+75
-0
test/java/awt/font/FontNames/LocaleFamilyNames.java
test/java/awt/font/FontNames/LocaleFamilyNames.java
+67
-0
未找到文件。
src/share/classes/sun/font/SunFontManager.java
浏览文件 @
4115bd36
...
@@ -1595,6 +1595,207 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE {
...
@@ -1595,6 +1595,207 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE {
}
}
}
}
/* Hardwire the English names and expected file names of fonts
* commonly used at start up. Avoiding until later even the small
* cost of calling platform APIs to locate these can help.
* The code that registers these fonts needs to "bail" if any
* of the files do not exist, so it will verify the existence of
* all non-null file names first.
* They are added in to a map with nominally the first
* word in the name of the family as the key. In all the cases
* we are using the the family name is a single word, and as is
* more or less required the family name is the initial sequence
* in a full name. So lookup first finds the matching description,
* then registers the whole family, returning the right font.
*/
public
static
class
FamilyDescription
{
public
String
familyName
;
public
String
plainFullName
;
public
String
boldFullName
;
public
String
italicFullName
;
public
String
boldItalicFullName
;
public
String
plainFileName
;
public
String
boldFileName
;
public
String
italicFileName
;
public
String
boldItalicFileName
;
}
static
HashMap
<
String
,
FamilyDescription
>
platformFontMap
;
/**
* default implementation does nothing.
*/
public
HashMap
<
String
,
FamilyDescription
>
populateHardcodedFileNameMap
()
{
return
new
HashMap
<
String
,
FamilyDescription
>(
0
);
}
Font2D
findFontFromPlatformMap
(
String
lcName
,
int
style
)
{
if
(
platformFontMap
==
null
)
{
platformFontMap
=
populateHardcodedFileNameMap
();
}
if
(
platformFontMap
==
null
||
platformFontMap
.
size
()
==
0
)
{
return
null
;
}
int
spaceIndex
=
lcName
.
indexOf
(
' '
);
String
firstWord
=
lcName
;
if
(
spaceIndex
>
0
)
{
firstWord
=
lcName
.
substring
(
0
,
spaceIndex
);
}
FamilyDescription
fd
=
platformFontMap
.
get
(
firstWord
);
if
(
fd
==
null
)
{
return
null
;
}
/* Once we've established that its at least the first word,
* we need to dig deeper to make sure its a match for either
* a full name, or the family name, to make sure its not
* a request for some other font that just happens to start
* with the same first word.
*/
int
styleIndex
=
-
1
;
if
(
lcName
.
equalsIgnoreCase
(
fd
.
plainFullName
))
{
styleIndex
=
0
;
}
else
if
(
lcName
.
equalsIgnoreCase
(
fd
.
boldFullName
))
{
styleIndex
=
1
;
}
else
if
(
lcName
.
equalsIgnoreCase
(
fd
.
italicFullName
))
{
styleIndex
=
2
;
}
else
if
(
lcName
.
equalsIgnoreCase
(
fd
.
boldItalicFullName
))
{
styleIndex
=
3
;
}
if
(
styleIndex
==
-
1
&&
!
lcName
.
equalsIgnoreCase
(
fd
.
familyName
))
{
return
null
;
}
String
plainFile
=
null
,
boldFile
=
null
,
italicFile
=
null
,
boldItalicFile
=
null
;
boolean
failure
=
false
;
/* In a terminal server config, its possible that getPathName()
* will return null, if the file doesn't exist, hence the null
* checks on return. But in the normal client config we need to
* follow this up with a check to see if all the files really
* exist for the non-null paths.
*/
getPlatformFontDirs
(
noType1Font
);
if
(
fd
.
plainFileName
!=
null
)
{
plainFile
=
getPathName
(
fd
.
plainFileName
);
if
(
plainFile
==
null
)
{
failure
=
true
;
}
}
if
(
fd
.
boldFileName
!=
null
)
{
boldFile
=
getPathName
(
fd
.
boldFileName
);
if
(
boldFile
==
null
)
{
failure
=
true
;
}
}
if
(
fd
.
italicFileName
!=
null
)
{
italicFile
=
getPathName
(
fd
.
italicFileName
);
if
(
italicFile
==
null
)
{
failure
=
true
;
}
}
if
(
fd
.
boldItalicFileName
!=
null
)
{
boldItalicFile
=
getPathName
(
fd
.
boldItalicFileName
);
if
(
boldItalicFile
==
null
)
{
failure
=
true
;
}
}
if
(
failure
)
{
if
(
FontUtilities
.
isLogging
())
{
FontUtilities
.
getLogger
().
info
(
"Hardcoded file missing looking for "
+
lcName
);
}
platformFontMap
.
remove
(
firstWord
);
return
null
;
}
/* Some of these may be null,as not all styles have to exist */
final
String
[]
files
=
{
plainFile
,
boldFile
,
italicFile
,
boldItalicFile
}
;
failure
=
java
.
security
.
AccessController
.
doPrivileged
(
new
java
.
security
.
PrivilegedAction
<
Boolean
>()
{
public
Boolean
run
()
{
for
(
int
i
=
0
;
i
<
files
.
length
;
i
++)
{
if
(
files
[
i
]
==
null
)
{
continue
;
}
File
f
=
new
File
(
files
[
i
]);
if
(!
f
.
exists
())
{
return
Boolean
.
TRUE
;
}
}
return
Boolean
.
FALSE
;
}
});
if
(
failure
)
{
if
(
FontUtilities
.
isLogging
())
{
FontUtilities
.
getLogger
().
info
(
"Hardcoded file missing looking for "
+
lcName
);
}
platformFontMap
.
remove
(
firstWord
);
return
null
;
}
/* If we reach here we know that we have all the files we
* expect, so all should be fine so long as the contents
* are what we'd expect. Now on to registering the fonts.
* Currently this code only looks for TrueType fonts, so format
* and rank can be specified without looking at the filename.
*/
Font2D
font
=
null
;
for
(
int
f
=
0
;
f
<
files
.
length
;
f
++)
{
if
(
files
[
f
]
==
null
)
{
continue
;
}
PhysicalFont
pf
=
registerFontFile
(
files
[
f
],
null
,
FONTFORMAT_TRUETYPE
,
false
,
Font2D
.
TTF_RANK
);
if
(
f
==
styleIndex
)
{
font
=
pf
;
}
}
/* Two general cases need a bit more work here.
* 1) If font is null, then it was perhaps a request for a
* non-existent font, such as "Tahoma Italic", or a family name -
* where family and full name of the plain font differ.
* Fall back to finding the closest one in the family.
* This could still fail if a client specified "Segoe" instead of
* "Segoe UI".
* 2) The request is of the form "MyFont Bold", style=Font.ITALIC,
* and so we want to see if there's a Bold Italic font, or
* "MyFamily", style=Font.BOLD, and we may have matched the plain,
* but now need to revise that to the BOLD font.
*/
FontFamily
fontFamily
=
FontFamily
.
getFamily
(
fd
.
familyName
);
if
(
fontFamily
!=
null
)
{
if
(
font
==
null
)
{
font
=
fontFamily
.
getFont
(
style
);
if
(
font
==
null
)
{
font
=
fontFamily
.
getClosestStyle
(
style
);
}
}
else
if
(
style
>
0
&&
style
!=
font
.
style
)
{
style
|=
font
.
style
;
font
=
fontFamily
.
getFont
(
style
);
if
(
font
==
null
)
{
font
=
fontFamily
.
getClosestStyle
(
style
);
}
}
}
return
font
;
}
private
synchronized
HashMap
<
String
,
String
>
getFullNameToFileMap
()
{
private
synchronized
HashMap
<
String
,
String
>
getFullNameToFileMap
()
{
if
(
fontToFileMap
==
null
)
{
if
(
fontToFileMap
==
null
)
{
...
@@ -1998,6 +2199,17 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE {
...
@@ -1998,6 +2199,17 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE {
}
}
if
(
FontUtilities
.
isWindows
)
{
if
(
FontUtilities
.
isWindows
)
{
font
=
findFontFromPlatformMap
(
lowerCaseName
,
style
);
if
(
FontUtilities
.
isLogging
())
{
FontUtilities
.
getLogger
()
.
info
(
"findFontFromPlatformMap returned "
+
font
);
}
if
(
font
!=
null
)
{
fontNameCache
.
put
(
mapName
,
font
);
return
font
;
}
/* Don't want Windows to return a Lucida Sans font from
/* Don't want Windows to return a Lucida Sans font from
* C:\Windows\Fonts
* C:\Windows\Fonts
*/
*/
...
@@ -2934,7 +3146,14 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE {
...
@@ -2934,7 +3146,14 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE {
}
}
}
}
protected
String
[]
getPlatformFontDirs
(
boolean
noType1Fonts
)
{
protected
String
[]
getPlatformFontDirs
(
boolean
noType1Fonts
)
{
/* First check if we already initialised path dirs */
if
(
pathDirs
!=
null
)
{
return
pathDirs
;
}
String
path
=
getPlatformFontPath
(
noType1Fonts
);
String
path
=
getPlatformFontPath
(
noType1Fonts
);
StringTokenizer
parser
=
StringTokenizer
parser
=
new
StringTokenizer
(
path
,
File
.
pathSeparator
);
new
StringTokenizer
(
path
,
File
.
pathSeparator
);
...
@@ -2945,7 +3164,8 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE {
...
@@ -2945,7 +3164,8 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE {
}
}
}
catch
(
NoSuchElementException
e
)
{
}
catch
(
NoSuchElementException
e
)
{
}
}
return
pathList
.
toArray
(
new
String
[
0
]);
pathDirs
=
pathList
.
toArray
(
new
String
[
0
]);
return
pathDirs
;
}
}
/**
/**
...
...
src/windows/classes/sun/awt/Win32FontManager.java
浏览文件 @
4115bd36
...
@@ -282,4 +282,79 @@ public class Win32FontManager extends SunFontManager {
...
@@ -282,4 +282,79 @@ public class Win32FontManager extends SunFontManager {
protected
static
native
void
deRegisterFontWithPlatform
(
String
fontName
);
protected
static
native
void
deRegisterFontWithPlatform
(
String
fontName
);
/**
* populate the map with the most common windows fonts.
*/
@Override
public
HashMap
<
String
,
FamilyDescription
>
populateHardcodedFileNameMap
()
{
HashMap
<
String
,
FamilyDescription
>
platformFontMap
=
new
HashMap
<
String
,
FamilyDescription
>();
FamilyDescription
fd
;
/* Segoe UI is the default UI font for Vista and later, and
* is used by the Win L&F which is used by FX too.
* Tahoma is used for the Win L&F on XP.
* Verdana is used in some FX UI controls.
*/
fd
=
new
FamilyDescription
();
fd
.
familyName
=
"Segoe UI"
;
fd
.
plainFullName
=
"Segoe UI"
;
fd
.
plainFileName
=
"segoeui.ttf"
;
fd
.
boldFullName
=
"Segoe UI Bold"
;
fd
.
boldFileName
=
"segoeuib.ttf"
;
fd
.
italicFullName
=
"Segoe UI Italic"
;
fd
.
italicFileName
=
"segoeuii.ttf"
;
fd
.
boldItalicFullName
=
"Segoe UI Bold Italic"
;
fd
.
boldItalicFileName
=
"segoeuiz.ttf"
;
platformFontMap
.
put
(
"segoe"
,
fd
);
fd
=
new
FamilyDescription
();
fd
.
familyName
=
"Tahoma"
;
fd
.
plainFullName
=
"Tahoma"
;
fd
.
plainFileName
=
"tahoma.ttf"
;
fd
.
boldFullName
=
"Tahoma Bold"
;
fd
.
boldFileName
=
"tahomabd.ttf"
;
platformFontMap
.
put
(
"tahoma"
,
fd
);
fd
=
new
FamilyDescription
();
fd
.
familyName
=
"Verdana"
;
fd
.
plainFullName
=
"Verdana"
;
fd
.
plainFileName
=
"verdana.TTF"
;
fd
.
boldFullName
=
"Verdana Bold"
;
fd
.
boldFileName
=
"verdanab.TTF"
;
fd
.
italicFullName
=
"Verdana Italic"
;
fd
.
italicFileName
=
"verdanai.TTF"
;
fd
.
boldItalicFullName
=
"Verdana Bold Italic"
;
fd
.
boldItalicFileName
=
"verdanaz.TTF"
;
platformFontMap
.
put
(
"verdana"
,
fd
);
/* The following are important because they are the core
* members of the default "Dialog" font.
*/
fd
=
new
FamilyDescription
();
fd
.
familyName
=
"Arial"
;
fd
.
plainFullName
=
"Arial"
;
fd
.
plainFileName
=
"ARIAL.TTF"
;
fd
.
boldFullName
=
"Arial Bold"
;
fd
.
boldFileName
=
"ARIALBD.TTF"
;
fd
.
italicFullName
=
"Arial Italic"
;
fd
.
italicFileName
=
"ARIALI.TTF"
;
fd
.
boldItalicFullName
=
"Arial Bold Italic"
;
fd
.
boldItalicFileName
=
"ARIALBI.TTF"
;
platformFontMap
.
put
(
"arial"
,
fd
);
fd
=
new
FamilyDescription
();
fd
.
familyName
=
"Symbol"
;
fd
.
plainFullName
=
"Symbol"
;
fd
.
plainFileName
=
"Symbol.TTF"
;
platformFontMap
.
put
(
"symbol"
,
fd
);
fd
=
new
FamilyDescription
();
fd
.
familyName
=
"WingDings"
;
fd
.
plainFullName
=
"WingDings"
;
fd
.
plainFileName
=
"WINGDING.TTF"
;
platformFontMap
.
put
(
"wingdings"
,
fd
);
return
platformFontMap
;
}
}
}
test/java/awt/font/FontNames/LocaleFamilyNames.java
0 → 100644
浏览文件 @
4115bd36
/*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 4935798 6521210 6901159
* @summary Tests that all family names that are reported in all locales
* correspond to some font returned from getAllFonts().
* @run main LocaleFamilyNames
*/
import
java.awt.*
;
import
java.util.*
;
public
class
LocaleFamilyNames
{
public
static
void
main
(
String
[]
args
)
throws
Exception
{
GraphicsEnvironment
ge
=
GraphicsEnvironment
.
getLocalGraphicsEnvironment
();
Font
[]
all_fonts
=
ge
.
getAllFonts
();
Locale
[]
all_locales
=
Locale
.
getAvailableLocales
();
HashSet
all_families
=
new
HashSet
();
for
(
int
i
=
0
;
i
<
all_fonts
.
length
;
i
++)
{
all_families
.
add
(
all_fonts
[
i
].
getFamily
());
for
(
int
j
=
0
;
j
<
all_locales
.
length
;
j
++)
{
all_families
.
add
(
all_fonts
[
i
].
getFamily
(
all_locales
[
j
]));
}
}
for
(
int
i
=
0
;
i
<
all_locales
.
length
;
i
++)
{
String
[]
families_for_locale
=
ge
.
getAvailableFontFamilyNames
(
all_locales
[
i
]);
for
(
int
j
=
0
;
j
<
families_for_locale
.
length
;
j
++)
{
if
(
!
all_families
.
contains
(
families_for_locale
[
j
])
)
{
System
.
out
.
println
(
"LOCALE: ["
+
all_locales
[
i
]+
"]"
);
System
.
out
.
print
(
"NO FONT HAS "
+
"THE FOLLOWING FAMILY NAME:"
);
System
.
out
.
println
(
"["
+
families_for_locale
[
j
]+
"]"
);
throw
new
Exception
(
"test failed"
);
}
}
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录