OSDN Git Service

クラスメンバ定義順統一
[jindolf/Jindolf.git] / src / main / java / jp / sourceforge / jindolf / FontInfo.java
1 /*\r
2  * font information\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.font.FontRenderContext;\r
12 import java.awt.font.GlyphVector;\r
13 import java.awt.geom.AffineTransform;\r
14 import java.text.CharacterIterator;\r
15 import jp.sourceforge.jindolf.json.JsBoolean;\r
16 import jp.sourceforge.jindolf.json.JsNumber;\r
17 import jp.sourceforge.jindolf.json.JsObject;\r
18 import jp.sourceforge.jindolf.json.JsPair;\r
19 import jp.sourceforge.jindolf.json.JsString;\r
20 import jp.sourceforge.jindolf.json.JsValue;\r
21 \r
22 /**\r
23  * フォント描画に関する各種設定。\r
24  */\r
25 public class FontInfo{\r
26 \r
27     /** デフォルトのフォント設定。 */\r
28     public static final FontInfo DEFAULT_FONTINFO = new FontInfo();\r
29 \r
30     private static final String HASH_FAMILY = "family";\r
31     private static final String HASH_SIZE = "size";\r
32     private static final String HASH_ISBOLD = "isBold";\r
33     private static final String HASH_ISITALIC = "isItalic";\r
34     private static final String HASH_USEAA = "useAntiAlias";\r
35     private static final String HASH_FRACTIONAL = "useFractional";\r
36 \r
37 \r
38     private Font font;\r
39     private FontRenderContext context;\r
40 \r
41 \r
42     /**\r
43      * コンストラクタ。\r
44      * デフォルトフォントとそれに適した描画属性が指定される。\r
45      */\r
46     public FontInfo(){\r
47         this(FontUtils.createDefaultSpeechFont());\r
48         return;\r
49     }\r
50 \r
51     /**\r
52      * コンストラクタ。\r
53      * 描画設定はフォント属性に応じて自動的に調整される。\r
54      * @param font フォント\r
55      * @throws NullPointerException 引数がnull\r
56      */\r
57     public FontInfo(Font font)\r
58             throws NullPointerException{\r
59         this(font, createBestContext(font));\r
60         return;\r
61     }\r
62 \r
63     /**\r
64      * コンストラクタ。\r
65      * @param font フォント\r
66      * @param context 描画設定\r
67      * @throws NullPointerException 引数がnull\r
68      */\r
69     public FontInfo(Font font, FontRenderContext context)\r
70             throws NullPointerException{\r
71         super();\r
72         if(font == null || context == null) throw new NullPointerException();\r
73         this.font = font;\r
74         this.context = context;\r
75         return;\r
76     }\r
77 \r
78 \r
79     /**\r
80      * フォントに応じた最適な描画設定を生成する。\r
81      * @param font フォント\r
82      * @return 描画設定\r
83      */\r
84     public static FontRenderContext createBestContext(Font font){\r
85         FontRenderContext result;\r
86 \r
87         AffineTransform identity = ImtblAffineTx.IDENTITY;\r
88         if(FontUtils.guessBitmapFont(font)){\r
89             result = new FontRenderContext(identity, false, false);\r
90         }else{\r
91             result = new FontRenderContext(identity, true, true);\r
92         }\r
93 \r
94         return result;\r
95     }\r
96 \r
97     /**\r
98      * フォント設定をJSON形式にエンコードする。\r
99      * @param fontInfo フォント設定\r
100      * @return JSON Object\r
101      */\r
102     public static JsObject buildJson(FontInfo fontInfo){\r
103         Font font = fontInfo.getFont();\r
104         FontRenderContext frc = fontInfo.getFontRenderContext();\r
105         JsPair type = new JsPair(HASH_FAMILY,\r
106                                  FontUtils.getRootFamilyName(font) );\r
107         JsPair size = new JsPair(HASH_SIZE, font.getSize());\r
108         JsPair bold = new JsPair(HASH_ISBOLD, font.isBold());\r
109         JsPair italic = new JsPair(HASH_ISITALIC, font.isItalic());\r
110         JsPair host = new JsPair(HASH_USEAA, frc.isAntiAliased());\r
111         JsPair port =\r
112                 new JsPair(HASH_FRACTIONAL, frc.usesFractionalMetrics());\r
113 \r
114         JsObject result = new JsObject();\r
115         result.putPair(type);\r
116         result.putPair(size);\r
117         result.putPair(bold);\r
118         result.putPair(italic);\r
119         result.putPair(host);\r
120         result.putPair(port);\r
121 \r
122         return result;\r
123     }\r
124 \r
125     /**\r
126      * JSONからのフォント設定復元。\r
127      * @param obj JSON Object\r
128      * @return フォント設定\r
129      */\r
130     public static FontInfo decodeJson(JsObject obj){\r
131         JsValue value;\r
132 \r
133         Font newFont = FontUtils.createDefaultSpeechFont();\r
134         FontRenderContext newFrc = createBestContext(newFont);\r
135         int style = newFont.getStyle();\r
136 \r
137         value = obj.getValue(HASH_FAMILY);\r
138         if(value instanceof JsString){\r
139             JsString string = (JsString) value;\r
140             Font decoded = Font.decode(string.toRawString());\r
141             if(decoded != null){\r
142                 newFont = decoded;\r
143             }\r
144         }\r
145 \r
146         int size = newFont.getSize();\r
147         value = obj.getValue(HASH_SIZE);\r
148         if(value instanceof JsNumber){\r
149             JsNumber number = (JsNumber) value;\r
150             size = number.intValue();\r
151         }\r
152 \r
153         boolean isBold = newFont.isBold();\r
154         value = obj.getValue(HASH_ISBOLD);\r
155         if(value instanceof JsBoolean){\r
156             JsBoolean bool = (JsBoolean) value;\r
157             isBold = bool.booleanValue();\r
158         }\r
159         if(isBold) style |= Font.BOLD;\r
160 \r
161         boolean isItalic = newFont.isItalic();\r
162         value = obj.getValue(HASH_ISITALIC);\r
163         if(value instanceof JsBoolean){\r
164             JsBoolean bool = (JsBoolean) value;\r
165             isItalic = bool.booleanValue();\r
166         }\r
167         if(isItalic) style |= Font.ITALIC;\r
168 \r
169         boolean isAntiAlias = newFrc.isAntiAliased();\r
170         value = obj.getValue(HASH_USEAA);\r
171         if(value instanceof JsBoolean){\r
172             JsBoolean bool = (JsBoolean) value;\r
173             isAntiAlias = bool.booleanValue();\r
174         }\r
175 \r
176         boolean useFractional = newFrc.usesFractionalMetrics();\r
177         value = obj.getValue(HASH_FRACTIONAL);\r
178         if(value instanceof JsBoolean){\r
179             JsBoolean bool = (JsBoolean) value;\r
180             useFractional = bool.booleanValue();\r
181         }\r
182 \r
183         newFont = newFont.deriveFont(style, (float)size);\r
184 \r
185         newFrc = new FontRenderContext(ImtblAffineTx.IDENTITY,\r
186                                        isAntiAlias, useFractional);\r
187 \r
188         FontInfo result = new FontInfo(newFont, newFrc);\r
189 \r
190         return result;\r
191     }\r
192 \r
193     /**\r
194      * フォントを返す。\r
195      * @return フォント\r
196      */\r
197     public Font getFont(){\r
198         return this.font;\r
199     }\r
200 \r
201     /**\r
202      * 描画属性を返す。\r
203      * @return 描画属性\r
204      */\r
205     public FontRenderContext getFontRenderContext(){\r
206         return this.context;\r
207     }\r
208 \r
209     /**\r
210      * フォントのみ異なる設定を派生させる。\r
211      * @param newFont 新フォント\r
212      * @return 新設定\r
213      */\r
214     public FontInfo deriveFont(Font newFont){\r
215         return new FontInfo(newFont, this.context);\r
216     }\r
217 \r
218     /**\r
219      * 描画属性のみ異なる設定を派生させる。\r
220      * @param newContext 新描画設定\r
221      * @return 新設定\r
222      */\r
223     public FontInfo deriveRenderContext(FontRenderContext newContext){\r
224         return new FontInfo(this.font, newContext);\r
225     }\r
226 \r
227     /**\r
228      * 文字列からグリフ集合を生成する。\r
229      * @param iterator 文字列\r
230      * @return グリフ集合\r
231      */\r
232     public GlyphVector createGlyphVector(CharacterIterator iterator){\r
233         GlyphVector glyph =\r
234                 this.font.createGlyphVector(this.context, iterator);\r
235         return glyph;\r
236     }\r
237 \r
238     /**\r
239      * {@inheritDoc}\r
240      * @param obj {@inheritDoc}\r
241      * @return {@inheritDoc}\r
242      */\r
243     @Override\r
244     public boolean equals(Object obj){\r
245         if( ! (obj instanceof FontInfo) ) return false;\r
246         FontInfo target = (FontInfo) obj;\r
247 \r
248         if( ! (this.font   .equals(target.font))    ) return false;\r
249         if( ! (this.context.equals(target.context)) ) return false;\r
250 \r
251         return true;\r
252     }\r
253 \r
254     /**\r
255      * {@inheritDoc}\r
256      * @return {@inheritDoc}\r
257      */\r
258     @Override\r
259     public int hashCode(){\r
260         return this.font.hashCode() ^ this.context.hashCode();\r
261     }\r
262 \r
263 }\r