19b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk/*
265c80f824711f084c4ece9204f543a7809534294Jason Sams * Copyright (C) 2008-2012 The Android Open Source Project
39b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk *
49b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
59b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk * you may not use this file except in compliance with the License.
69b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk * You may obtain a copy of the License at
79b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk *
89b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
99b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk *
109b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
119b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
129b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk * See the License for the specific language governing permissions and
149b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk * limitations under the License.
159b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk */
169b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
179b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchoukpackage android.renderscript;
189b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
19e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchoukimport java.io.File;
209b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchoukimport java.io.IOException;
219b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchoukimport java.io.InputStream;
2227f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchoukimport java.util.HashMap;
23e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchoukimport java.util.Map;
24e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
25e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchoukimport android.os.Environment;
269b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
279b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchoukimport android.content.res.AssetManager;
28e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchoukimport android.content.res.Resources;
299b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchoukimport android.util.Log;
309b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchoukimport android.util.TypedValue;
319b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
329c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
33a90842283e322b1210e2bea5850b05177e3d87afTim Murray * @hide
3465c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16
35a90842283e322b1210e2bea5850b05177e3d87afTim Murray * <p>This class gives users a simple way to draw hardware accelerated text.
3611518acc8c416023d8c2192b441a1767205676d9Robert Ly * Internally, the glyphs are rendered using the Freetype library and an internal cache of
3711518acc8c416023d8c2192b441a1767205676d9Robert Ly * rendered glyph bitmaps is maintained. Each font object represents a combination of a typeface,
3811518acc8c416023d8c2192b441a1767205676d9Robert Ly * and point size. You can create multiple font objects to represent styles such as bold or italic text,
3911518acc8c416023d8c2192b441a1767205676d9Robert Ly * faces, and different font sizes. During creation, the Android system quieries device's screen DPI to
4011518acc8c416023d8c2192b441a1767205676d9Robert Ly * ensure proper sizing across multiple device configurations.</p>
4111518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>Fonts are rendered using screen-space positions and no state setup beyond binding a
42c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * font to the RenderScript is required. A note of caution on performance, though the state changes
4311518acc8c416023d8c2192b441a1767205676d9Robert Ly * are transparent to the user, they do happen internally, and it is more efficient to
4411518acc8c416023d8c2192b441a1767205676d9Robert Ly * render large batches of text in sequence. It is also more efficient to render multiple
4511518acc8c416023d8c2192b441a1767205676d9Robert Ly * characters at once instead of one by one to improve draw call batching.</p>
4611518acc8c416023d8c2192b441a1767205676d9Robert Ly * <p>Font color and transparency are not part of the font object and you can freely modify
47a90842283e322b1210e2bea5850b05177e3d87afTim Murray * them in the script to suit the user's rendering needs. Font colors work as a state machine.
4811518acc8c416023d8c2192b441a1767205676d9Robert Ly * Every new call to draw text uses the last color set in the script.</p>
499b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk **/
509b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchoukpublic class Font extends BaseObj {
519b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
5227f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    //These help us create a font by family name
5327f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    private static final String[] sSansNames = {
5427f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        "sans-serif", "arial", "helvetica", "tahoma", "verdana"
5527f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    };
5627f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
5727f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    private static final String[] sSerifNames = {
5827f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        "serif", "times", "times new roman", "palatino", "georgia", "baskerville",
5927f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        "goudy", "fantasy", "cursive", "ITC Stone Serif"
6027f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    };
6127f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
6227f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    private static final String[] sMonoNames = {
6327f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        "monospace", "courier", "courier new", "monaco"
6427f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    };
6527f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
6627f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    private static class FontFamily {
6727f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        String[] mNames;
6827f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        String mNormalFileName;
6927f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        String mBoldFileName;
7027f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        String mItalicFileName;
7127f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        String mBoldItalicFileName;
7227f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    }
7327f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
7427f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    private static Map<String, FontFamily> sFontFamilyMap;
7527f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
7665c80f824711f084c4ece9204f543a7809534294Jason Sams    /**
7765c80f824711f084c4ece9204f543a7809534294Jason Sams     * @deprecated in API 16
7865c80f824711f084c4ece9204f543a7809534294Jason Sams     */
7927f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    public enum Style {
8065c80f824711f084c4ece9204f543a7809534294Jason Sams        /**
8165c80f824711f084c4ece9204f543a7809534294Jason Sams         * @deprecated in API 16
8265c80f824711f084c4ece9204f543a7809534294Jason Sams         */
8327f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        NORMAL,
8465c80f824711f084c4ece9204f543a7809534294Jason Sams        /**
8565c80f824711f084c4ece9204f543a7809534294Jason Sams         * @deprecated in API 16
8665c80f824711f084c4ece9204f543a7809534294Jason Sams         */
8727f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        BOLD,
8865c80f824711f084c4ece9204f543a7809534294Jason Sams        /**
8965c80f824711f084c4ece9204f543a7809534294Jason Sams         * @deprecated in API 16
9065c80f824711f084c4ece9204f543a7809534294Jason Sams         */
9127f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        ITALIC,
9265c80f824711f084c4ece9204f543a7809534294Jason Sams        /**
9365c80f824711f084c4ece9204f543a7809534294Jason Sams         * @deprecated in API 16
9465c80f824711f084c4ece9204f543a7809534294Jason Sams         */
9527f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        BOLD_ITALIC;
9627f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    }
9727f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
9827f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    private static void addFamilyToMap(FontFamily family) {
9927f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        for(int i = 0; i < family.mNames.length; i ++) {
10027f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk            sFontFamilyMap.put(family.mNames[i], family);
10127f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        }
10227f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    }
10327f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
10427f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    private static void initFontFamilyMap() {
10527f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        sFontFamilyMap = new HashMap<String, FontFamily>();
10627f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
10727f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        FontFamily sansFamily = new FontFamily();
10827f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        sansFamily.mNames = sSansNames;
109beb2b5cfdb79ac9147296e3a6bd21970a947a6f4Christian Robertson        sansFamily.mNormalFileName = "Roboto-Regular.ttf";
110beb2b5cfdb79ac9147296e3a6bd21970a947a6f4Christian Robertson        sansFamily.mBoldFileName = "Roboto-Bold.ttf";
111beb2b5cfdb79ac9147296e3a6bd21970a947a6f4Christian Robertson        sansFamily.mItalicFileName = "Roboto-Italic.ttf";
112beb2b5cfdb79ac9147296e3a6bd21970a947a6f4Christian Robertson        sansFamily.mBoldItalicFileName = "Roboto-BoldItalic.ttf";
11327f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        addFamilyToMap(sansFamily);
11427f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
11527f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        FontFamily serifFamily = new FontFamily();
11627f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        serifFamily.mNames = sSerifNames;
11727f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        serifFamily.mNormalFileName = "DroidSerif-Regular.ttf";
11827f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        serifFamily.mBoldFileName = "DroidSerif-Bold.ttf";
11927f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        serifFamily.mItalicFileName = "DroidSerif-Italic.ttf";
12027f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        serifFamily.mBoldItalicFileName = "DroidSerif-BoldItalic.ttf";
12127f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        addFamilyToMap(serifFamily);
12227f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
12327f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        FontFamily monoFamily = new FontFamily();
12427f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        monoFamily.mNames = sMonoNames;
12527f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        monoFamily.mNormalFileName = "DroidSansMono.ttf";
12627f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        monoFamily.mBoldFileName = "DroidSansMono.ttf";
12727f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        monoFamily.mItalicFileName = "DroidSansMono.ttf";
12827f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        monoFamily.mBoldItalicFileName = "DroidSansMono.ttf";
12927f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        addFamilyToMap(monoFamily);
13027f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    }
13127f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
13227f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    static {
13327f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        initFontFamilyMap();
13427f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    }
13527f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
13627f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    static String getFontFileName(String familyName, Style style) {
13727f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        FontFamily family = sFontFamilyMap.get(familyName);
13827f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        if(family != null) {
13927f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk            switch(style) {
14027f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk                case NORMAL:
14127f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk                    return family.mNormalFileName;
14227f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk                case BOLD:
14327f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk                    return family.mBoldFileName;
14427f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk                case ITALIC:
14527f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk                    return family.mItalicFileName;
14627f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk                case BOLD_ITALIC:
14727f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk                    return family.mBoldItalicFileName;
14827f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk            }
14927f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        }
15027f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        // Fallback if we could not find the desired family
15127f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        return "DroidSans.ttf";
15227f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    }
15327f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
1549b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    Font(int id, RenderScript rs) {
1550de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
1569b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    }
1579b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
1589c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
15965c80f824711f084c4ece9204f543a7809534294Jason Sams     * @deprecated in API 16
16027f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk     * Takes a specific file name as an argument
16127f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk     */
162b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public Font createFromFile(RenderScript rs, Resources res, String path, float pointSize) {
1639b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk        rs.validate();
164b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        int dpi = res.getDisplayMetrics().densityDpi;
165b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        int fontId = rs.nFontCreateFromFile(path, pointSize, dpi);
1669b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
167b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if(fontId == 0) {
168b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to create font from file " + path);
1699b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk        }
170b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        Font rsFont = new Font(fontId, rs);
1719b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk
172b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return rsFont;
1739b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk    }
17427f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk
17565c80f824711f084c4ece9204f543a7809534294Jason Sams    /**
17665c80f824711f084c4ece9204f543a7809534294Jason Sams     * @deprecated in API 16
17765c80f824711f084c4ece9204f543a7809534294Jason Sams     */
178b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public Font createFromFile(RenderScript rs, Resources res, File path, float pointSize) {
179e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        return createFromFile(rs, res, path.getAbsolutePath(), pointSize);
180e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
181e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
18265c80f824711f084c4ece9204f543a7809534294Jason Sams    /**
18365c80f824711f084c4ece9204f543a7809534294Jason Sams     * @deprecated in API 16
18465c80f824711f084c4ece9204f543a7809534294Jason Sams     */
185b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public Font createFromAsset(RenderScript rs, Resources res, String path, float pointSize) {
186b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        rs.validate();
187b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        AssetManager mgr = res.getAssets();
188b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        int dpi = res.getDisplayMetrics().densityDpi;
189b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
190b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        int fontId = rs.nFontCreateFromAsset(mgr, path, pointSize, dpi);
191b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if(fontId == 0) {
192b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to create font from asset " + path);
193b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
194b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        Font rsFont = new Font(fontId, rs);
195b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return rsFont;
196e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
197e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
19865c80f824711f084c4ece9204f543a7809534294Jason Sams    /**
19965c80f824711f084c4ece9204f543a7809534294Jason Sams     * @deprecated in API 16
20065c80f824711f084c4ece9204f543a7809534294Jason Sams     */
201b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public Font createFromResource(RenderScript rs, Resources res, int id, float pointSize) {
202b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        String name = "R." + Integer.toString(id);
203b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
204b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        rs.validate();
205b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        InputStream is = null;
206b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        try {
207b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            is = res.openRawResource(id);
208b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        } catch (Exception e) {
209b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to open resource " + id);
210b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
211b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
212b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        int dpi = res.getDisplayMetrics().densityDpi;
213b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
214b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        int fontId = 0;
215b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if (is instanceof AssetManager.AssetInputStream) {
216b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            int asset = ((AssetManager.AssetInputStream) is).getAssetInt();
217b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            fontId = rs.nFontCreateFromAssetStream(name, pointSize, dpi, asset);
218b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        } else {
219b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unsupported asset stream created");
220b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
221b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk
222b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        if(fontId == 0) {
223b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk            throw new RSRuntimeException("Unable to create font from resource " + id);
224b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        }
225b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        Font rsFont = new Font(fontId, rs);
226b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk        return rsFont;
227e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk    }
228e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
2299c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
23065c80f824711f084c4ece9204f543a7809534294Jason Sams     * @deprecated in API 16
23127f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk     * Accepts one of the following family names as an argument
2323d782666d73c3ce0ffb77e71db7309bc3297ecb8Stephen Hines     * and will attempt to produce the best match with a system font:
2333d782666d73c3ce0ffb77e71db7309bc3297ecb8Stephen Hines     *
23427f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk     * "sans-serif" "arial" "helvetica" "tahoma" "verdana"
23527f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk     * "serif" "times" "times new roman" "palatino" "georgia" "baskerville"
23627f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk     * "goudy" "fantasy" "cursive" "ITC Stone Serif"
23727f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk     * "monospace" "courier" "courier new" "monaco"
2383d782666d73c3ce0ffb77e71db7309bc3297ecb8Stephen Hines     *
2393d782666d73c3ce0ffb77e71db7309bc3297ecb8Stephen Hines     * Returns default font if no match could be found.
24027f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk     */
241b0253ea6969bdd27bf574e0da7fa91aa6d09f44fAlex Sakhartchouk    static public Font create(RenderScript rs, Resources res, String familyName, Style fontStyle, float pointSize) {
24227f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk        String fileName = getFontFileName(familyName, fontStyle);
243e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        String fontPath = Environment.getRootDirectory().getAbsolutePath();
244e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        fontPath += "/fonts/" + fileName;
245e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        return createFromFile(rs, res, fontPath, pointSize);
24627f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchouk    }
247e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk
2489b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk}
249