OSDN Git Service

クラスメンバ定義順統一
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / FontUtils.java
1 /*\r
2  * font utilities\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2009 olyutorskii\r
6  */\r
7 \r
8 package jp.sourceforge.jindolf;\r
9 \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
16 \r
17 /**\r
18  * フォントユーティリティ。\r
19  */\r
20 public final class FontUtils{\r
21 \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
26 \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
30         "Osaka",\r
31         "MS PGothic",                // for WinXP\r
32         "MS Gothic",\r
33         // TODO X11用のおすすめは?\r
34     };\r
35 \r
36     /** JIS0208:1990 チェック用。 */\r
37     private static final String JPCHECK_CODE = "9Aあゑアアヴヰ┼ЖΩ峠凜熙";\r
38 \r
39 \r
40     /**\r
41      * 隠れコンストラクタ。\r
42      */\r
43     private FontUtils(){\r
44         assert false;\r
45     }\r
46 \r
47 \r
48     /**\r
49      * システムに存在する有効なファミリ名か判定する。\r
50      * @param family フォントファミリ名。\r
51      * @return 存在する有効なファミリ名ならtrue\r
52      */\r
53     public static boolean isValidFamilyName(String family){\r
54         int style = 0x00 | Font.PLAIN;\r
55         int size = 1;\r
56         Font dummyFont = new Font(family, style, size);\r
57 \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
62 \r
63         return false;\r
64     }\r
65 \r
66     /**\r
67      * 発言用のデフォルトフォントを生成する。\r
68      * 適当なファミリが見つからなかったら"Dialog"が選択される。\r
69      * @return デフォルトフォント\r
70      */\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
76                 break;\r
77             }\r
78         }\r
79 \r
80         int style = 0x00 | Font.PLAIN;\r
81         int size = 16;\r
82         Font result = new Font(defaultFamilyName, style, size);\r
83 \r
84         return result;\r
85     }\r
86 \r
87     /**\r
88      * ソートされたフォントファミリ一覧表を生成する。\r
89      * JISX0208:1990相当が表示できないファミリは弾かれる。\r
90      * 結構実行時間がかかるかも。乱用禁物。\r
91      * @return フォント一覧\r
92      */\r
93     public static SortedSet<String> createFontSet(){\r
94         GraphicsEnvironment ge =\r
95                 GraphicsEnvironment.getLocalGraphicsEnvironment();\r
96 \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
102         }\r
103 \r
104         return Collections.unmodifiableSortedSet(result);\r
105     }\r
106 \r
107     /**\r
108      * ビットマップフォントか否か見当をつける。\r
109      * ビットマップフォントにはアンチエイリアスやサブピクセルを使わないほうが\r
110      * 見栄えがいいような気がする。\r
111      * @param font 判定対象フォント\r
112      * @return ビットマップフォントらしかったらtrue\r
113      */\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
120             return true;\r
121         }\r
122         return false;\r
123     }\r
124 \r
125     /**\r
126      * Font#decode()用の名前を返す。\r
127      * @param font フォント\r
128      * @return Font#decode()用の名前\r
129      */\r
130     public static String getFontDecodeName(Font font){\r
131         StringBuilder result = new StringBuilder();\r
132 \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
137 \r
138         result.append(getRootFamilyName(font));\r
139         result.append('-').append(style);\r
140         result.append('-').append(font.getSize());\r
141 \r
142         if(   result.indexOf("\u0020") >= 0\r
143            || result.indexOf("\u3000") >= 0 ){\r
144             result.insert(0, '"').append('"');\r
145         }\r
146 \r
147         return result.toString();\r
148     }\r
149 \r
150     /**\r
151      * ロケール中立なフォントファミリ名を返す。\r
152      * JRE1.5対策\r
153      * @param font フォント\r
154      * @return ファミリ名\r
155      */\r
156     public static String getRootFamilyName(Font font){\r
157         return font.getFamily(ROOT);\r
158     }\r
159 \r
160 }\r