FontFamily.java revision 18e9f9f3778318918c44d944489cb50daaf45d1c
11a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien/*
21a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * Copyright (C) 2014 The Android Open Source Project
31a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien *
41a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * Licensed under the Apache License, Version 2.0 (the "License");
51a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * you may not use this file except in compliance with the License.
61a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * You may obtain a copy of the License at
71a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien *
81a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien *      http://www.apache.org/licenses/LICENSE-2.0
91a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien *
101a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * Unless required by applicable law or agreed to in writing, software
111a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * distributed under the License is distributed on an "AS IS" BASIS,
121a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * See the License for the specific language governing permissions and
141a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * limitations under the License.
151a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien */
161a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
171a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienpackage android.graphics;
181a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
19d573794d83a049fe59e289944f0cd77406dd776aRaph Levienimport android.content.res.AssetManager;
20296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levienimport android.util.Log;
21d573794d83a049fe59e289944f0cd77406dd776aRaph Levien
22296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levienimport java.io.FileInputStream;
23296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levienimport java.io.IOException;
24fb95699364e555148b437cfa1e5c69384f843845Ben Wagnerimport java.nio.ByteBuffer;
25296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levienimport java.nio.channels.FileChannel;
26a87b07d7fafd59ae26073a80cd742b17ea427ecdBen Wagnerimport java.util.List;
27a87b07d7fafd59ae26073a80cd742b17ea427ecdBen Wagner
281a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien/**
291a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * A family of typefaces with different styles.
301a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien *
311a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien * @hide
321a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien */
331a73f732f91e97c9c66b808c245ddda36a10e987Raph Levienpublic class FontFamily {
34296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien
35296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien    private static String TAG = "FontFamily";
36296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien
379a5b61ccc83303ceeec2059f58c1977af9faa9e3Raph Levien    /**
389a5b61ccc83303ceeec2059f58c1977af9faa9e3Raph Levien     * @hide
399a5b61ccc83303ceeec2059f58c1977af9faa9e3Raph Levien     */
401a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    public long mNativePtr;
419a5b61ccc83303ceeec2059f58c1977af9faa9e3Raph Levien
421a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    public FontFamily() {
43c0d685b87aa544bc23c1ed1c01e88f6c04855f72Siyamed Sinir        mNativePtr = nCreateFamily(null, 0);
44c0d685b87aa544bc23c1ed1c01e88f6c04855f72Siyamed Sinir        if (mNativePtr == 0) {
45c0d685b87aa544bc23c1ed1c01e88f6c04855f72Siyamed Sinir            throw new IllegalStateException("error creating native FontFamily");
46c0d685b87aa544bc23c1ed1c01e88f6c04855f72Siyamed Sinir        }
47f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien    }
48f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien
49f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien    public FontFamily(String lang, String variant) {
50f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien        int varEnum = 0;
51f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien        if ("compact".equals(variant)) {
52f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien            varEnum = 1;
53f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien        } else if ("elegant".equals(variant)) {
54f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien            varEnum = 2;
55f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien        }
56c0d685b87aa544bc23c1ed1c01e88f6c04855f72Siyamed Sinir        mNativePtr = nCreateFamily(lang, varEnum);
57c0d685b87aa544bc23c1ed1c01e88f6c04855f72Siyamed Sinir        if (mNativePtr == 0) {
58c0d685b87aa544bc23c1ed1c01e88f6c04855f72Siyamed Sinir            throw new IllegalStateException("error creating native FontFamily");
599a5b61ccc83303ceeec2059f58c1977af9faa9e3Raph Levien        }
601a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    }
6115cf4757dc0099301662f8a26da561434cc07cfaRaph Levien
6215cf4757dc0099301662f8a26da561434cc07cfaRaph Levien    @Override
6315cf4757dc0099301662f8a26da561434cc07cfaRaph Levien    protected void finalize() throws Throwable {
6415cf4757dc0099301662f8a26da561434cc07cfaRaph Levien        try {
6515cf4757dc0099301662f8a26da561434cc07cfaRaph Levien            nUnrefFamily(mNativePtr);
6615cf4757dc0099301662f8a26da561434cc07cfaRaph Levien        } finally {
6715cf4757dc0099301662f8a26da561434cc07cfaRaph Levien            super.finalize();
6815cf4757dc0099301662f8a26da561434cc07cfaRaph Levien        }
6915cf4757dc0099301662f8a26da561434cc07cfaRaph Levien    }
701a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
713fa667e22401bf3ba96957fe31167bf05d164c55Seigo Nonaka    public boolean addFont(String path, int ttcIndex) {
72296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien        try (FileInputStream file = new FileInputStream(path)) {
73296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien            FileChannel fileChannel = file.getChannel();
74296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien            long fontSize = fileChannel.size();
75296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien            ByteBuffer fontBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fontSize);
76c0d685b87aa544bc23c1ed1c01e88f6c04855f72Siyamed Sinir            return nAddFont(mNativePtr, fontBuffer, ttcIndex);
77296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien        } catch (IOException e) {
78296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien            Log.e(TAG, "Error mapping font file " + path);
79296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien            return false;
80296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien        }
81d573794d83a049fe59e289944f0cd77406dd776aRaph Levien    }
82d573794d83a049fe59e289944f0cd77406dd776aRaph Levien
83fb95699364e555148b437cfa1e5c69384f843845Ben Wagner    public boolean addFontWeightStyle(ByteBuffer font, int ttcIndex, List<FontListParser.Axis> axes,
84a87b07d7fafd59ae26073a80cd742b17ea427ecdBen Wagner            int weight, boolean style) {
85c0d685b87aa544bc23c1ed1c01e88f6c04855f72Siyamed Sinir        return nAddFontWeightStyle(mNativePtr, font, ttcIndex, axes, weight, style);
86117cbebe810613d4a6de034f02652cdbbfef4cdeRaph Levien    }
87117cbebe810613d4a6de034f02652cdbbfef4cdeRaph Levien
8818e9f9f3778318918c44d944489cb50daaf45d1cClara Bayarri    public boolean addFontFromAssetManager(AssetManager mgr, String path, int cookie,
8918e9f9f3778318918c44d944489cb50daaf45d1cClara Bayarri            boolean isAsset) {
9018e9f9f3778318918c44d944489cb50daaf45d1cClara Bayarri        return nAddFontFromAssetManager(mNativePtr, mgr, path, cookie, isAsset);
911a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien    }
921a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien
93c0d685b87aa544bc23c1ed1c01e88f6c04855f72Siyamed Sinir    private static native long nCreateFamily(String lang, int variant);
94d573794d83a049fe59e289944f0cd77406dd776aRaph Levien    private static native void nUnrefFamily(long nativePtr);
95c0d685b87aa544bc23c1ed1c01e88f6c04855f72Siyamed Sinir    private static native boolean nAddFont(long nativeFamily, ByteBuffer font, int ttcIndex);
96c0d685b87aa544bc23c1ed1c01e88f6c04855f72Siyamed Sinir    private static native boolean nAddFontWeightStyle(long nativeFamily, ByteBuffer font,
97a87b07d7fafd59ae26073a80cd742b17ea427ecdBen Wagner            int ttcIndex, List<FontListParser.Axis> listOfAxis,
98a87b07d7fafd59ae26073a80cd742b17ea427ecdBen Wagner            int weight, boolean isItalic);
9918e9f9f3778318918c44d944489cb50daaf45d1cClara Bayarri    private static native boolean nAddFontFromAssetManager(long nativeFamily, AssetManager mgr,
10018e9f9f3778318918c44d944489cb50daaf45d1cClara Bayarri            String path, int cookie, boolean isAsset);
1011a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien}
102