blob: 14ff9976116f18b2ca5b876edfa7b154a0825ad9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Ilya S. Okomin
* @version $Revision$
*/
package org.apache.harmony.awt.gl.font;
import com.android.internal.awt.AndroidGraphics2D;
import com.android.internal.awt.AndroidGraphicsFactory;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.peer.FontPeer;
import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;
import java.util.ArrayList;
import java.util.Locale;
import org.apache.harmony.awt.internal.nls.Messages;
import android.graphics.Paint;
/**
* Abstract class for platform dependent peer implementation of the Font class.
*/
public abstract class FontPeerImpl implements FontPeer{
// ascent of this font peer (in pixels)
int ascent;
// descent of this font peer (in pixels)
int descent;
// leading of this font peer (in pixels)
int leading;
// logical maximum advance of this font peer (in pixels)
int maxAdvance;
// the height of this font peer
float height;
// the style of this font peer
int style;
// the point size of this font peer (in pixels)
int size;
// the logical hight of this font peer (in pixels)
int logicalHeight;
// the name of this font peer
String name;
// family name of this font peer
String fontFamilyName;
// the Face name of this font peer
String faceName;
// bounds rectanlge of the largest character in this font peer
Rectangle2D maxCharBounds;
// italic angle value of this font peer
float italicAngle = 0.0f;
// the number of glyphs supported by this font peer
int numGlyphs = 0;
// native font handle
long pFont;
// cached line metrics object
LineMetricsImpl nlm;
// the postscript name of this font peer
String psName = null;
/**
* Default glyph index, that is used, when the desired glyph
* is unsupported in this Font.
*/
public char defaultChar = (char)0xFFFF;
/**
* Uniform LineMetrics flag, that is false for CompositeFont.
* Default value is true.
*/
boolean uniformLM = true;
/**
* Flag of the type of this Font that is indicate is the Font
* has TrueType or Type1 type. Default value is FONT_TYPE_UNDEF.
*/
int fontType = FontManager.FONT_TYPE_UNDEF;
/**
* Flag if this Font was created from stream,
* this parameter used in finilize method.
*/
private boolean createdFromStream = false;
// temorary Font file name, if this FontPeerImpl was created from InputStream
private String tempFontFileName = null;
// cached FontExtraMetrics object related to this font peer
FontExtraMetrics extraMetrix = null;
public abstract FontExtraMetrics getExtraMetrics();
/**
* Returns LineMetrics object with specified parameters
* @param str specified String
* @param frc specified render context
* @param at specified affine transform
* @return
*/
public abstract LineMetrics getLineMetrics(String str, FontRenderContext frc, AffineTransform at);
/**
* Returns postscript name of the font.
*/
public abstract String getPSName();
//private Graphics2D g = ((AndroidGraphicsFactory)Toolkit.getDefaultToolkit().getGraphicsFactory()).getGraphics2D();
//private Graphics2D g = AndroidGraphics2D.getInstance();
/**
* Set postscript name of the font to the specified parameter.
*/
public void setPSName(String name){
this.psName = name;
}
/**
* Returns code of the missing glyph.
*/
public abstract int getMissingGlyphCode();
/**
* Returns Glyph representation of the given char.
* @param ch specified char
*/
public abstract Glyph getGlyph(char ch);
/**
* Disposes nesessary resources.
*/
public abstract void dispose();
/**
* Returns Glyph represeting missing char.
*/
public abstract Glyph getDefaultGlyph();
/**
* Returns true if this FontPeerImpl can display the specified char
*/
public abstract boolean canDisplay(char c);
/**
* Returns family name of the font in specified locale settings.
* @param l specified Locale
*/
public String getFamily(Locale l){
return this.getFamily();
}
/**
* Sets family name of the font in specified locale settings.
*/
public void setFamily(String familyName){
this.fontFamilyName = familyName;
}
/**
* Returns face name of the font in specified locale settings.
* @param l specified Locale
*/
public String getFontName(Locale l){
return this.getFontName();
}
/**
* Sets font name of the font in specified locale settings.
*/
public void setFontName(String fontName){
this.faceName = fontName;
}
/**
* Returns true, if this font peer was created from InputStream, false otherwise.
* In case of creating fonts from InputStream some font peer implementations
* may need to free temporary resources.
*/
public boolean isCreatedFromStream(){
return this.createdFromStream;
}
/**
* Sets createdFromStream flag to the specified parameter.
* If parameter is true it means font peer was created from InputStream.
*
* @param value true, if font peer was created from InputStream
*/
public void setCreatedFromStream(boolean value){
this.createdFromStream = value;
}
/**
* Returns font file name of this font.
*/
public String getTempFontFileName(){
return this.tempFontFileName;
}
/**
* Sets font file name of this font to the specified one.
* @param value String representing font file name
*/
public void setFontFileName(String value){
this.tempFontFileName = value;
}
/**
* Returns the advance width of the specified char of this FontPeerImpl.
* Note, if glyph is absent in the font's glyphset - returned value
* is the advance of the deafualt glyph. For escape-chars returned
* width value is 0.
*
* @param ch the char which width is to be returned
* @return the advance width of the specified char of this FontPeerImpl
*/
public int charWidth(char ch) {
Paint p;
AndroidGraphics2D g = AndroidGraphics2D.getInstance();
if(g == null) {
throw new RuntimeException("AndroidGraphics2D not instantiated!");
}
p = ((AndroidGraphics2D)g).getAndroidPaint();
char[] ca = {ch};
float[] fa = new float[1];
p.getTextWidths(ca, 0, 1, fa);
return (int)fa[0];
}
/**
* Returns the advance width of the specified char of this FontPeerImpl.
*
* @param ind the char which width is to be returned
* @return the advance width of the specified char of this FontPeerImpl
*/
public int charWidth(int ind) {
return charWidth((char)ind);
}
/**
* Returns an array of Glyphs that represent characters from the specified
* Unicode range.
*
* @param uFirst start position in Unicode range
* @param uLast end position in Unicode range
* @return
*/
public Glyph[] getGlyphs(char uFirst, char uLast) {
char i = uFirst;
int len = uLast - uFirst;
ArrayList<Glyph> lst = new ArrayList<Glyph>(len);
if (size < 0) {
// awt.09=min range bound value is greater than max range bound
throw new IllegalArgumentException(Messages.getString("awt.09")); //$NON-NLS-1$
}
while (i < uLast) {
lst.add(this.getGlyph(i));
}
return (Glyph[]) lst.toArray();
}
/**
* Returns an array of Glyphs representing given array of chars.
*
* @param chars specified array of chars
*/
public Glyph[] getGlyphs(char[] chars) {
if (chars == null){
return null;
}
Glyph[] result = new Glyph[chars.length];
for (int i = 0; i < chars.length; i++) {
result[i] = this.getGlyph(chars[i]);
}
return result;
}
/**
* Returns an array of Glyphs representing given string.
*
* @param str specified string
*/
public Glyph[] getGlyphs(String str) {
char[] chars = str.toCharArray();
return this.getGlyphs(chars);
}
/**
* Returns family name of this FontPeerImpl.
*/
public String getFamily() {
return fontFamilyName;
}
/**
* Returns face name of this FontPeerImpl.
*/
public String getFontName() {
if (this.fontType == FontManager.FONT_TYPE_T1){
return this.fontFamilyName;
}
return faceName;
}
/**
* Returns height of this font peer in pixels.
*/
public int getLogicalHeight() {
return logicalHeight;
}
/**
* Sets height of this font peer in pixels to the given value.
*
* @param newHeight new height in pixels value
*/
public void setLogicalHeight(int newHeight) {
logicalHeight = newHeight;
}
/**
* Returns font size.
*/
public int getSize() {
return size;
}
/**
* Returns font style.
*/
public int getStyle() {
return style;
}
/**
* Returns font name.
*/
public String getName() {
return name;
}
/**
* Returns the bounds of the largest char in this FontPeerImpl in
* specified render context.
*
* @param frc specified FontRenderContext
*/
public Rectangle2D getMaxCharBounds(FontRenderContext frc) {
return maxCharBounds;
}
/**
* Returns the number of glyphs in this FontPeerImpl.
*/
public int getNumGlyphs() {
return numGlyphs;
}
/**
* Returns tangens of the italic angle of this FontPeerImpl.
* If the FontPeerImpl has TrueType font type, italic angle value can be
* calculated as (CharSlopeRun / CharSlopeRise) in terms of GDI.
*/
public float getItalicAngle() {
return italicAngle;
}
/**
* Returns height of this font peer.
*/
public float getHeight(){
return height;
}
/**
* Returns cached LineMetrics object of this font peer.
*/
public LineMetrics getLineMetrics(){
return nlm;
}
/**
* Returns native font handle of this font peer.
*/
public long getFontHandle(){
return pFont;
}
/**
* Returns ascent of this font peer.
*/
public int getAscent(){
Paint p;
AndroidGraphics2D g = AndroidGraphics2D.getInstance();
if(g == null) {
throw new RuntimeException("AndroidGraphics2D not instantiated!");
}
p = ((AndroidGraphics2D)g).getAndroidPaint();
return (int)p.ascent();
//return ascent;
}
/**
* Returns descent of this font peer.
*/
public int getDescent(){
return descent;
}
/**
* Returns leading of this font peer.
*/
public int getLeading(){
return leading;
}
/**
* Returns true if this font peer has uniform line metrics.
*/
public boolean hasUniformLineMetrics(){
return uniformLM;
}
/**
* Returns type of this font.
*
* @return one of constant font type values.
*/
public int getFontType(){
return fontType;
}
/**
* Sets new font type to the font object.
*
* @param newType new type value
*/
public void setFontType(int newType){
if (newType == FontManager.FONT_TYPE_T1 || newType == FontManager.FONT_TYPE_TT){
fontType = newType;
}
}
/**
* Sets new font type to the font object.
*
* @param newType new type value
*/
@Override
protected void finalize() throws Throwable {
super.finalize();
dispose();
}
}