4 * License : The MIT License
\r
5 * Copyright(c) 2009 olyutorskii
\r
8 package jp.sourceforge.jindolf;
\r
10 import java.awt.Font;
\r
11 import java.awt.GraphicsEnvironment;
\r
12 import java.util.Collections;
\r
13 import java.util.Locale;
\r
14 import java.util.SortedSet;
\r
15 import java.util.TreeSet;
\r
20 public final class FontUtils{
\r
22 /** Font.DIALOG代替品。 */
\r
23 public static final String FAMILY_DIALOG = "Dialog";
\r
24 /** Locale.ROOT代替品。 */
\r
25 private static final Locale ROOT = new Locale("", "", "");
\r
27 private static final String[] INIT_FAMILY_NAMES = {
\r
28 "Hiragino Kaku Gothic Pro", // for MacOS X
\r
29 "Hiragino Kaku Gothic Std",
\r
31 "MS PGothic", // for WinXP
\r
36 /** JIS0208:1990 チェック用。 */
\r
37 private static final String JPCHECK_CODE = "9Aあゑアアヴヰ┼ЖΩ峠凜熙";
\r
43 private FontUtils(){
\r
49 * システムに存在する有効なファミリ名か判定する。
\r
50 * @param family フォントファミリ名。
\r
51 * @return 存在する有効なファミリ名ならtrue
\r
53 public static boolean isValidFamilyName(String family){
\r
54 int style = 0x00 | Font.PLAIN;
\r
56 Font dummyFont = new Font(family, style, size);
\r
58 String dummyFamily = getRootFamilyName(dummyFont);
\r
59 String dummyLocalFamily = dummyFont.getFamily();
\r
60 if(dummyFamily .equals(family)) return true;
\r
61 if(dummyLocalFamily.equals(family)) return true;
\r
67 * 発言用のデフォルトフォントを生成する。
\r
68 * 適当なファミリが見つからなかったら"Dialog"が選択される。
\r
71 public static Font createDefaultSpeechFont(){
\r
72 String defaultFamilyName = FAMILY_DIALOG;
\r
73 for(String familyName : INIT_FAMILY_NAMES){
\r
74 if(isValidFamilyName(familyName)){
\r
75 defaultFamilyName = familyName;
\r
80 int style = 0x00 | Font.PLAIN;
\r
82 Font result = new Font(defaultFamilyName, style, size);
\r
88 * ソートされたフォントファミリ一覧表を生成する。
\r
89 * JISX0208:1990相当が表示できないファミリは弾かれる。
\r
90 * 結構実行時間がかかるかも。乱用禁物。
\r
93 public static SortedSet<String> createFontSet(){
\r
94 GraphicsEnvironment ge =
\r
95 GraphicsEnvironment.getLocalGraphicsEnvironment();
\r
97 SortedSet<String> result = new TreeSet<String>();
\r
98 for(Font font : ge.getAllFonts()){
\r
99 if(font.canDisplayUpTo(JPCHECK_CODE) >= 0) continue;
\r
100 String familyName = font.getFamily();
\r
101 result.add(familyName.intern());
\r
104 return Collections.unmodifiableSortedSet(result);
\r
108 * ビットマップフォントか否か見当をつける。
\r
109 * ビットマップフォントにはアンチエイリアスやサブピクセルを使わないほうが
\r
111 * @param font 判定対象フォント
\r
112 * @return ビットマップフォントらしかったらtrue
\r
114 public static boolean guessBitmapFont(Font font){
\r
115 String familyName = getRootFamilyName(font);
\r
116 if( font.getSize() < 24
\r
117 && familyName.startsWith("MS")
\r
118 && ( familyName.contains("Gothic")
\r
119 || familyName.contains("Mincho") ) ){
\r
126 * Font#decode()用の名前を返す。
\r
128 * @return Font#decode()用の名前
\r
130 public static String getFontDecodeName(Font font){
\r
131 StringBuilder result = new StringBuilder();
\r
133 StringBuilder style = new StringBuilder();
\r
134 if(font.isBold()) style.append("BOLD");
\r
135 if(font.isItalic()) style.append("ITALIC");
\r
136 if(style.length() <= 0) style.append("PLAIN");
\r
138 result.append(getRootFamilyName(font));
\r
139 result.append('-').append(style);
\r
140 result.append('-').append(font.getSize());
\r
142 if( result.indexOf("\u0020") >= 0
\r
143 || result.indexOf("\u3000") >= 0 ){
\r
144 result.insert(0, '"').append('"');
\r
147 return result.toString();
\r
151 * ロケール中立なフォントファミリ名を返す。
\r
156 public static String getRootFamilyName(Font font){
\r
157 return font.getFamily(ROOT);
\r