19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  this work for additional information regarding copyright ownership.
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  the License.  You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @author Ilya S. Okomin
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @version $Revision$
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage org.apache.harmony.awt.gl.font;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Font;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.peer.FontPeer;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Properties;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Vector;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.font.FontManager;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.font.FontProperty;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.internal.nls.Messages;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AndroidFontManager extends FontManager {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // set of all available faces supported by a system
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String faces[];
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // weight names according to xlfd structure
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String[] LINUX_WEIGHT_NAMES = {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "black", "bold", "demibold", "medium", "light" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // slant names according to xlfd structure
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String[] LINUX_SLANT_NAMES = {
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "i", "o", "r" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Singleton AndroidFontManager instance */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final AndroidFontManager inst = new AndroidFontManager();
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AndroidFontManager() {
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super();
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        faces = new String[] {/*"PLAIN",*/ "NORMAL", "BOLD", "ITALIC", "BOLDITALIC"};
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initFontProperties();
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void initLCIDTable(){
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    	throw new RuntimeException("Not implemented!");
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns temporary File object to store data from InputStream.
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This File object saved to `~/.fonts/' folder that is included in the
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * list of folders searched for font files, and this is where user-specific
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * font files should be installed.
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public File getTempFontFile()throws IOException{
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File fontFile = File.createTempFile("jFont", ".ttf", new File(System.getProperty("user.home") +"/.fonts")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fontFile.deleteOnExit();
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fontFile;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initializes fProperties array field for the current system configuration font
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * property file.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * RuntimeException is thrown if font property contains incorrect format of
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * xlfd string.
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true is success, false if font property doesn't exist or doesn't
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * contain roperties.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean initFontProperties(){
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        File fpFile = getFontPropertyFile();
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (fpFile == null){
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Properties props = getProperties(fpFile);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (props == null){
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i < LOGICAL_FONT_NAMES.length; i++){
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String lName = LOGICAL_FONT_NAMES[i];
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j=0; j < STYLE_NAMES.length; j++){
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String styleName = STYLE_NAMES[j];
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Vector propsVector = new Vector();
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Number of entries for a logical font
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numComp = 0;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Is more entries for this style and logical font name left
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean moreEntries = true;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String value = null;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while(moreEntries){
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Component Font Mappings property name
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String property = FONT_MAPPING_KEYS[0].replaceAll("LogicalFontName", lName).replaceAll("StyleName", styleName).replaceAll("ComponentIndex", String.valueOf(numComp)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    value = props.getProperty(property);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If the StyleName is omitted, it's assumed to be plain
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if ((j == 0) && (value == null)){
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        property = FONT_MAPPING_KEYS[1].replaceAll("LogicalFontName", lName).replaceAll("ComponentIndex", String.valueOf(numComp)); //$NON-NLS-1$ //$NON-NLS-2$
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        value = props.getProperty(property);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (value != null){
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        String[] fields = parseXLFD(value);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (fields == null){
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // awt.08=xfld parse string error: {0}
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            throw new RuntimeException(Messages.getString("awt.08", value)); //$NON-NLS-1$
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        String fontName = fields[1];
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        String weight = fields[2];
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        String italic = fields[3];
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int style = getBoldStyle(weight) | getItalicStyle(italic);
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Component Font Character Encodings property value
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        String encoding = props.getProperty(FONT_CHARACTER_ENCODING.replaceAll("LogicalFontName", lName).replaceAll("ComponentIndex", String.valueOf(numComp))); //$NON-NLS-1$ //$NON-NLS-2$
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Exclusion Ranges property value
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        String exclString = props.getProperty(EXCLUSION_RANGES.replaceAll("LogicalFontName", lName).replaceAll("ComponentIndex", String.valueOf(numComp))); //$NON-NLS-1$ //$NON-NLS-2$
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        int[] exclRange = parseIntervals(exclString);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        FontProperty fp = new AndroidFontProperty(lName, styleName, null, fontName, value, style, exclRange, encoding);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        propsVector.add(fp);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        numComp++;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        moreEntries = false;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                fProperties.put(LOGICAL_FONT_NAMES[i] + "." + j, propsVector); //$NON-NLS-1$
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns style according to the xlfd weight string.
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If weight string is incorrect returned value is Font.PLAIN
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param str weight name String
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int getBoldStyle(String str){
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < LINUX_WEIGHT_NAMES.length;i++){
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (str.equalsIgnoreCase(LINUX_WEIGHT_NAMES[i])){
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return (i < 3) ? Font.BOLD : Font.PLAIN;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Font.PLAIN;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns style according to the xlfd slant string.
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If slant string is incorrect returned value is Font.PLAIN
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param str slant name String
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int getItalicStyle(String str){
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < LINUX_SLANT_NAMES.length;i++){
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (str.equalsIgnoreCase(LINUX_SLANT_NAMES[i])){
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return (i < 2) ? Font.ITALIC : Font.PLAIN;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Font.PLAIN;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Parse xlfd string and returns array of Strings with separate xlfd
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * elements.<p>
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * xlfd format:
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *      -Foundry-Family-Weight-Slant-Width-Style-PixelSize-PointSize-ResX-ResY-Spacing-AvgWidth-Registry-Encoding
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param xlfd String parameter in xlfd format
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static String[] parseXLFD(String xlfd){
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int fieldsCount = 14;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String fieldsDelim = "-"; //$NON-NLS-1$
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String[] res = new String[fieldsCount];
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!xlfd.startsWith(fieldsDelim)){
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        xlfd = xlfd.substring(1);
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i=0;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (i=0; i < fieldsCount-1; i++){
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos = xlfd.indexOf(fieldsDelim);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (pos != -1){
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                res[i] = xlfd.substring(0, pos);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                xlfd = xlfd.substring(pos + 1);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pos = xlfd.indexOf(fieldsDelim);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // check if no fields left
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(pos != -1){
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        res[fieldsCount-1] = xlfd;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return res;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getFaceIndex(String faceName){
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < faces.length; i++) {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(faces[i].equals(faceName)){
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return i;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] getAllFamilies(){
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (allFamilies == null){
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        	allFamilies = new String[]{"sans-serif", "serif", "monospace"};
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return allFamilies;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Font[] getAllFonts(){
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Font[] fonts = new Font[faces.length];
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i =0; i < fonts.length;i++){
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fonts[i] = new Font(faces[i], Font.PLAIN, 1);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fonts;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FontPeer createPhysicalFontPeer(String name, int style, int size) {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AndroidFont peer;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int familyIndex = getFamilyIndex(name);
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (familyIndex != -1){
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // !! we use family names from the list with cached families because
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // they are differ from the family names in xlfd structure, in xlfd
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // family names mostly in lower case.
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            peer = new AndroidFont(getFamily(familyIndex), style, size);
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            peer.setFamily(getFamily(familyIndex));
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return peer;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int faceIndex = getFaceIndex(name);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (faceIndex != -1){
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            peer = new AndroidFont(name, style, size);
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return peer;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public FontPeer createDefaultFont(int style, int size) {
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    	Log.i("DEFAULT FONT", Integer.toString(style));
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new AndroidFont(DEFAULT_NAME, style, size);
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
278