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.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
25 public class FontInfo{
\r
27 /** デフォルトのフォント設定。 */
\r
28 public static final FontInfo DEFAULT_FONTINFO = new FontInfo();
\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
39 private FontRenderContext context;
\r
44 * デフォルトフォントとそれに適した描画属性が指定される。
\r
47 this(FontUtils.createDefaultSpeechFont());
\r
53 * 描画設定はフォント属性に応じて自動的に調整される。
\r
55 * @throws NullPointerException 引数がnull
\r
57 public FontInfo(Font font)
\r
58 throws NullPointerException{
\r
59 this(font, createBestContext(font));
\r
66 * @param context 描画設定
\r
67 * @throws NullPointerException 引数がnull
\r
69 public FontInfo(Font font, FontRenderContext context)
\r
70 throws NullPointerException{
\r
72 if(font == null || context == null) throw new NullPointerException();
\r
74 this.context = context;
\r
80 * フォントに応じた最適な描画設定を生成する。
\r
84 public static FontRenderContext createBestContext(Font font){
\r
85 FontRenderContext result;
\r
87 AffineTransform identity = ImtblAffineTx.IDENTITY;
\r
88 if(FontUtils.guessBitmapFont(font)){
\r
89 result = new FontRenderContext(identity, false, false);
\r
91 result = new FontRenderContext(identity, true, true);
\r
98 * フォント設定をJSON形式にエンコードする。
\r
99 * @param fontInfo フォント設定
\r
100 * @return JSON Object
\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
112 new JsPair(HASH_FRACTIONAL, frc.usesFractionalMetrics());
\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
127 * @param obj JSON Object
\r
130 public static FontInfo decodeJson(JsObject obj){
\r
133 Font newFont = FontUtils.createDefaultSpeechFont();
\r
134 FontRenderContext newFrc = createBestContext(newFont);
\r
135 int style = newFont.getStyle();
\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
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
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
159 if(isBold) style |= Font.BOLD;
\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
167 if(isItalic) style |= Font.ITALIC;
\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
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
183 newFont = newFont.deriveFont(style, (float)size);
\r
185 newFrc = new FontRenderContext(ImtblAffineTx.IDENTITY,
\r
186 isAntiAlias, useFractional);
\r
188 FontInfo result = new FontInfo(newFont, newFrc);
\r
197 public Font getFont(){
\r
205 public FontRenderContext getFontRenderContext(){
\r
206 return this.context;
\r
210 * フォントのみ異なる設定を派生させる。
\r
211 * @param newFont 新フォント
\r
214 public FontInfo deriveFont(Font newFont){
\r
215 return new FontInfo(newFont, this.context);
\r
219 * 描画属性のみ異なる設定を派生させる。
\r
220 * @param newContext 新描画設定
\r
223 public FontInfo deriveRenderContext(FontRenderContext newContext){
\r
224 return new FontInfo(this.font, newContext);
\r
229 * @param iterator 文字列
\r
232 public GlyphVector createGlyphVector(CharacterIterator iterator){
\r
233 GlyphVector glyph =
\r
234 this.font.createGlyphVector(this.context, iterator);
\r
240 * @param obj {@inheritDoc}
\r
241 * @return {@inheritDoc}
\r
244 public boolean equals(Object obj){
\r
245 if( ! (obj instanceof FontInfo) ) return false;
\r
246 FontInfo target = (FontInfo) obj;
\r
248 if( ! (this.font .equals(target.font)) ) return false;
\r
249 if( ! (this.context.equals(target.context)) ) return false;
\r
256 * @return {@inheritDoc}
\r
259 public int hashCode(){
\r
260 return this.font.hashCode() ^ this.context.hashCode();
\r