View Javadoc

1   /*
2    * All Rights Reserved.
3    * Copyright (C) 1999-2005 Tsukuba Bunko.
4    *
5    * Licensed under the BSD License ("the License"); you may not use
6    * this file except in compliance with the License.
7    * You may obtain a copy of the License at
8    *
9    *       http://www.tsukuba-bunko.org/licenses/LICENSE.txt
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   *
17   * $Id: Line.java,v 1.2 2005/07/23 18:54:35 ppoi Exp $
18   */
19  package tsukuba_bunko.peko.canvas.text;
20  
21  import	java.io.Serializable;
22  
23  import	java.awt.Color;
24  import	java.awt.Graphics2D;
25  import	java.awt.Shape;
26  
27  import	java.awt.font.TextAttribute;
28  import	java.awt.font.TextLayout;
29  
30  import	java.text.AttributedString;
31  
32  
33  /***
34   * ページに描画される行です。
35   * @author	$Author: ppoi $
36   * @version	$Revision: 1.2 $
37   */
38  public class Line	implements Serializable	{
39  
40  	/***
41  	 * serial version UID
42  	 */
43  	private static final long	serialVersionUID	= 6658248129363617887L;
44  
45  	/***
46  	 * 描画する TextLayout
47  	 */
48  	transient private TextLayout	_textLayout = null;
49  
50  	/***
51  	 * shadow
52  	 */
53  	transient private Shape	_shape = null;
54  
55  	/***
56  	 * line span
57  	 */
58  	private float	_lineSpan = 0f;
59  
60  	/***
61  	 */
62  	private Color	_foreground = null;
63  
64  	/***
65  	 */
66  	private Color	_shadowColor = Color.black;
67  
68  	/***
69  	 * この行に描画される文字列
70  	 */
71  	private String	_text = null;
72  
73  
74  	/***
75  	 * <code>Line</code> のインスタンスを作成します。
76  	 */
77  	public Line()
78  	{
79  		super();
80  	}
81  
82  	/***
83  	 * 描画に使用する前景色を指定します。
84  	 * @param	color	前景色
85  	 */
86  	public void setForeground( Color color )
87  	{
88  		_foreground = color;
89  	}
90  
91  	/***
92  	 * 描画に使用する前景色を取得します。
93  	 * @return	前景色
94  	 */
95  	public Color getForeground()
96  	{
97  		return _foreground;
98  	}
99  
100 	/***
101 	 * 描画に使用する影の色を指定します。
102 	 * @param	color	影の色
103 	 */
104 	public void setShadowColor( Color color )
105 	{
106 		_shadowColor = color;
107 	}
108 
109 	/***
110 	 * 描画に使用する影の色を取得します。
111 	 * @return	描画に使用する影の色
112 	 */
113 	public Color getShadowColor()
114 	{
115 		return _shadowColor;
116 	}
117 
118 	/***
119 	 * 描画する文字列を設定します。
120 	 * @param	text	描画する文字列
121 	 */
122 	public void setText( String text )
123 	{
124 		_text = text;
125 	}
126 
127 	/***
128 	 * 描画する文字列を取得します。
129 	 * @return	描画する文字列
130 	 */
131 	public String getText()
132 	{
133 		return _text;
134 	}
135 
136 	/***
137 	 * 描画する TextLayout を設定します。
138 	 * @param	layout	描画する TextLayout
139 	 */
140 	public void setTextLayout( TextLayout layout )
141 	{
142 		_textLayout = layout;
143 		_shape = layout.getOutline( null );
144 	}
145 
146 	/***
147 	 * 描画する TextLayout を取得します。
148 	 * @return	描画する TextLayout
149 	 */
150 	public TextLayout getTextLayout()
151 	{
152 		return _textLayout;
153 	}
154 
155 	/***
156 	 * 行間隔を設定します。
157 	 * @param	lineSpan	行間隔
158 	 */
159 	public void setLineSpan( float lineSpan )
160 	{
161 		_lineSpan = lineSpan;
162 	}
163 
164 	/***
165 	 * 行間隔を取得します。
166 	 * @return	行間隔
167 	 */
168 	public float getLineSpan()
169 	{
170 		return _lineSpan;
171 	}
172 
173 	/***
174 	 * ベースラインより上の部分の長さ(ascent)を取得します。ascent には、行間隔部分も含まれます。
175 	 * @return	ascent
176 	 */
177 	public float getAscent()
178 	{
179 		return _textLayout.getAscent() + _lineSpan;
180 	}
181 
182 	/***
183 	 * ベースラインより下の部分の長さ(descent)を取得します。
184 	 * @return	descent
185 	 */
186 	public float getDescent()
187 	{
188 		return _textLayout.getDescent();
189 	}
190 
191 	/***
192 	 * 行の長さ(advance)を取得します。
193 	 * @return	advance
194 	 */
195 	public float getAdavance()
196 	{
197 		return _textLayout.getAdvance();
198 	}
199 
200 	/***
201 	 * 行を描画します。
202 	 * @param	g2	グラフィックコンテクスト
203 	 * @param	x	描画開始位置の x 座標
204 	 * @param	y	ベースラインの y 座標
205 	 */
206 	public void draw( Graphics2D g2, float x, float y )
207 	{
208 		Graphics2D	g = (Graphics2D)g2.create();
209 		g.translate( (int)x + 2, (int)y + 2 );
210 		if( _shadowColor == null )	{
211 			g.setColor( Color.black );
212 		}
213 		else	{
214 			g.setColor( _shadowColor );
215 		}
216 		g.setRenderingHint( java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON );
217 		g.fill( _shape );
218 
219 		Color	original = g2.getColor();
220 		if( _foreground != null )	{
221 			g2.setColor( _foreground );
222 		}
223 		_textLayout.draw( g2, x, y );
224 
225 		g2.setColor( original );
226 	}
227 
228 
229 	/***
230 	 * 描画の準備を行います。
231 	 */
232 	public void prepare( Page page )
233 	{
234 		if( _textLayout == null )	{
235 			AttributedString	astring = new AttributedString( _text );
236 			astring.addAttribute( TextAttribute.FONT, page.getDefaultFont() );
237 			astring.addAttribute( TextAttribute.FOREGROUND, page.getForeground() );
238 
239 			setTextLayout( new TextLayout(astring.getIterator(), page.getFontRenderContext()) );
240 		}
241 	}
242 }