blob: e8ad1bb6eb2f9ce25c8a506694725b38ffa820e4 [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 java.awt.Font;
import java.awt.Toolkit;
import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.util.Hashtable;
import java.util.Locale;
import org.apache.harmony.awt.gl.font.FontManager;
import org.apache.harmony.awt.gl.font.FontPeerImpl;
import org.apache.harmony.awt.gl.font.Glyph;
import org.apache.harmony.awt.gl.font.LineMetricsImpl;
import org.apache.harmony.awt.internal.nls.Messages;
/**
* Linux platform font peer implementation based on Xft and FreeType libraries.
*/
public class AndroidFont extends FontPeerImpl {
// Pairs of [begin, end],[..].. unicode ranges values
private int[] fontUnicodeRanges;
// table with loaded cached Glyphs
private Hashtable glyphs = new Hashtable();
// X11 display value
private long display = 0;
// X11 screen value
private int screen = 0;
public AndroidFont(String fontName, int fontStyle, int fontSize) {
/*
* Workaround : to initialize awt platform-dependent fields and libraries.
*/
Toolkit.getDefaultToolkit();
this.name = fontName;
this.size = fontSize;
this.style = fontStyle;
initAndroidFont();
}
/**
* Initializes some native dependent font information, e.g. number of glyphs,
* font metrics, italic angle etc.
*/
public void initAndroidFont(){
this.nlm = new AndroidLineMetrics(this, null, " "); //$NON-NLS-1$
this.ascent = nlm.getLogicalAscent();
this.descent = nlm.getLogicalDescent();
this.height = nlm.getHeight();
this.leading = nlm.getLogicalLeading();
this.maxAdvance = nlm.getLogicalMaxCharWidth();
if (this.fontType == FontManager.FONT_TYPE_T1){
this.defaultChar = 1;
} else {
this.defaultChar = 0;
}
this.maxCharBounds = new Rectangle2D.Float(0, -nlm.getAscent(), nlm.getMaxCharWidth(), this.height);
}
public boolean canDisplay(char chr) {
// TODO: to improve performance there is a sence to implement get
// unicode ranges to check if char can be displayed without
// native calls in isGlyphExists() method
return isGlyphExists(chr);
}
public LineMetrics getLineMetrics(String str, FontRenderContext frc, AffineTransform at) {
// Initialize baseline offsets
nlm.getBaselineOffsets();
LineMetricsImpl lm = (LineMetricsImpl)(this.nlm.clone());
lm.setNumChars(str.length());
if ((at != null) && (!at.isIdentity())){
lm.scale((float)at.getScaleX(), (float)at.getScaleY());
}
return lm;
}
public String getPSName() {
return psName;
}
public String getFamily(Locale l) {
// TODO: implement localized family
if (fontType == FontManager.FONT_TYPE_TT){
return this.getFamily();
}
return this.fontFamilyName;
}
public String getFontName(Locale l) {
if ((pFont == 0) || (this.fontType == FontManager.FONT_TYPE_T1)){
return this.name;
}
return this.getFontName();
}
public int getMissingGlyphCode() {
return getDefaultGlyph().getGlyphCode();
}
public Glyph getGlyph(char index) {
Glyph result = null;
Object key = new Integer(index);
if (glyphs.containsKey(key)) {
result = (Glyph) glyphs.get(key);
} else {
if (this.addGlyph(index)) {
result = (Glyph) glyphs.get(key);
} else {
result = this.getDefaultGlyph();
}
}
return result;
}
public Glyph getDefaultGlyph() {
throw new RuntimeException("DefaultGlyphs not implemented!");
}
/**
* Disposes native font handle. If this font peer was created from InputStream
* temporary created font resource file is deleted.
*/
public void dispose(){
String tempDirName;
if (pFont != 0){
pFont = 0;
if (isCreatedFromStream()) {
File fontFile = new File(getTempFontFileName());
tempDirName = fontFile.getParent();
fontFile.delete();
}
}
}
/**
* Add glyph to cached Glyph objects in this LinuxFont object.
*
* @param uChar the specified character
* @return true if glyph of the specified character exists in this
* LinuxFont or this character is escape sequence character.
*/
public boolean addGlyph(char uChar) {
throw new RuntimeException("Not implemented!");
}
/**
* Adds range of existing glyphs to this LinuxFont object
*
* @param uFirst the lowest range's bound, inclusive
* @param uLast the highest range's bound, exclusive
*/
public void addGlyphs(char uFirst, char uLast) {
char index = uFirst;
if (uLast < uFirst) {
// awt.09=min range bound value is grater than max range bound
throw new IllegalArgumentException(Messages.getString("awt.09")); //$NON-NLS-1$
}
while (index < uLast) {
addGlyph(index);
index++;
}
}
/**
* Returns true if specified character has corresopnding glyph, false otherwise.
*
* @param uIndex specified char
*/
public boolean isGlyphExists(char uIndex) {
throw new RuntimeException("DefaultGlyphs not implemented!");
}
/**
* Returns an array of unicode ranges that are supported by this LinuxFont.
*/
public int[] getUnicodeRanges() {
int[] ranges = new int[fontUnicodeRanges.length];
System.arraycopy(fontUnicodeRanges, 0, ranges, 0,
fontUnicodeRanges.length);
return ranges;
}
/**
* Return Font object if it was successfully embedded in System
*/
public static Font embedFont(String absolutePath){
throw new RuntimeException("embedFont not implemented!");
}
public String getFontName(){
if ((pFont != 0) && (faceName == null)){
if (this.fontType == FontManager.FONT_TYPE_T1){
faceName = getFamily();
}
}
return faceName;
}
public String getFamily() {
return fontFamilyName;
}
/**
* Returns initiated FontExtraMetrics instance of this WindowsFont.
*/
public FontExtraMetrics getExtraMetrics(){
throw new RuntimeException("Not implemented!");
}
}