KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > openlaszlo > iv > flash > fop > SWFFontMetric


1 /*
2  * $Id: SWFFontMetric.java,v 1.3 2002/02/24 02:10:19 skavish Exp $
3  *
4  * ==========================================================================
5  *
6  * The JGenerator Software License, Version 1.0
7  *
8  * Copyright (c) 2000 Dmitry Skavish (skavish@usa.net). All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if
22  * any, must include the following acknowlegement:
23  * "This product includes software developed by Dmitry Skavish
24  * (skavish@usa.net, http://www.flashgap.com/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The name "The JGenerator" must not be used to endorse or promote
29  * products derived from this software without prior written permission.
30  * For written permission, please contact skavish@usa.net.
31  *
32  * 5. Products derived from this software may not be called "The JGenerator"
33  * nor may "The JGenerator" appear in their names without prior written
34  * permission of Dmitry Skavish.
35  *
36  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39  * DISCLAIMED. IN NO EVENT SHALL DMITRY SKAVISH OR THE OTHER
40  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47  * SUCH DAMAGE.
48  *
49  */

50
51 package org.openlaszlo.iv.flash.fop;
52
53 import org.openlaszlo.iv.flash.api.*;
54 import org.openlaszlo.iv.flash.api.shape.*;
55 import org.openlaszlo.iv.flash.api.action.*;
56 import org.openlaszlo.iv.flash.api.button.*;
57 import org.openlaszlo.iv.flash.api.text.*;
58 import org.openlaszlo.iv.flash.parser.*;
59 import org.openlaszlo.iv.flash.util.*;
60
61
62 import java.io.*;
63 import java.util.*;
64
65 /**
66  * Implementation of the FOP FontMetric interface. This class
67  * returns information about Flash fonts to the FOP Framework.
68  *
69  * @author Johan "Spocke" Sörlin
70  * @author James Taylor
71  */

72
73 public class SWFFontMetric implements org.apache.fop.layout.FontMetric
74 {
75     private String JavaDoc fontName = null;
76     private Font flashFont = null;
77     private int widths[] = null;
78
79     /**
80      * Create a new SWFFontMetric for the given font filename
81      */

82
83     public SWFFontMetric( String JavaDoc fontName )
84     {
85         this.fontName = fontName;
86     }
87
88     public int getAscender( int size )
89     {
90         Font font = getFont( );
91         int realAscent;
92
93         realAscent = font.ascent - font.descent;
94
95         return convertUnits( size * realAscent );
96     }
97
98     public int getCapHeight( int size )
99     {
100         return this.getAscender( size );
101     }
102
103     public int getDescender( int size )
104     {
105         Font font = getFont( );
106
107         return convertUnits( -1 * size * font.descent );
108     }
109
110     public int getFirstChar( )
111     {
112         return 32;
113     }
114
115     public int getLastChar( )
116     {
117         return 255;
118     }
119
120     public int[] getWidths( int size )
121     {
122         Font font = getFont( );
123
124         if ( this.widths == null )
125         {
126             this.widths = new int[ 255 ];
127
128             for ( int i = 0; i < this.widths.length; i++ )
129             {
130                 int code = font.getIndex( ( char ) i );
131                 this.widths[ i ] = convertUnits( size * ( font.getAdvanceValue( code ) * 2 ) );
132             }
133         }
134
135         return this.widths;
136     }
137
138     public int getXHeight( int size )
139     {
140         Font font = getFont( );
141
142         return convertUnits( ( size
143                  + ( font.ascent * 1000 )
144                  + ( font.descent * 1000 ) ) * 1000 );
145     }
146
147     public int width( int i, int size )
148     {
149         Font font = getFont( );
150
151         int code = font.getIndex( ( char ) i );
152         int width = font.getAdvanceValue( code );
153
154         return convertUnits( width * size );
155     }
156
157     /**
158      * Return the Font object for this metric.
159      */

160
161     public Font getFont()
162     {
163         if ( flashFont == null )
164         {
165             flashFont = FontDef.load( fontName );
166         }
167
168         return flashFont;
169     }
170
171     /**
172      * SWF uses a 1024 x 1024 EM square, while fop uses 1000x1000, thus all
173      * metric values must be converted.
174      */

175
176     private int convertUnits( int n )
177     {
178         return Math.round( n * ( 1000f / 1024f ) );
179     }
180 }
181
Popular Tags