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() { 43f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien mNativePtr = nCreateFamily(null, 0); 449a5b61ccc83303ceeec2059f58c1977af9faa9e3Raph Levien if (mNativePtr == 0) { 45f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien throw new IllegalStateException("error creating native FontFamily"); 46f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien } 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 } 56f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien mNativePtr = nCreateFamily(lang, varEnum); 57f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien if (mNativePtr == 0) { 58f9e3d311275c37fe5f2562993687a1627780a6d0Raph Levien 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); 76296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien 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) { 85fb95699364e555148b437cfa1e5c69384f843845Ben Wagner return nAddFontWeightStyle(mNativePtr, font, ttcIndex, axes, weight, style); 86117cbebe810613d4a6de034f02652cdbbfef4cdeRaph Levien } 87117cbebe810613d4a6de034f02652cdbbfef4cdeRaph Levien 88d573794d83a049fe59e289944f0cd77406dd776aRaph Levien public boolean addFontFromAsset(AssetManager mgr, String path) { 89d573794d83a049fe59e289944f0cd77406dd776aRaph Levien return nAddFontFromAsset(mNativePtr, mgr, path); 901a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien } 911a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien 92d573794d83a049fe59e289944f0cd77406dd776aRaph Levien private static native long nCreateFamily(String lang, int variant); 93d573794d83a049fe59e289944f0cd77406dd776aRaph Levien private static native void nUnrefFamily(long nativePtr); 94296bf8c55aaba0025f3e5b904fda3b6e15686753Raph Levien private static native boolean nAddFont(long nativeFamily, ByteBuffer font, int ttcIndex); 95fb95699364e555148b437cfa1e5c69384f843845Ben Wagner private static native boolean nAddFontWeightStyle(long nativeFamily, ByteBuffer font, 96a87b07d7fafd59ae26073a80cd742b17ea427ecdBen Wagner int ttcIndex, List<FontListParser.Axis> listOfAxis, 97a87b07d7fafd59ae26073a80cd742b17ea427ecdBen Wagner int weight, boolean isItalic); 98d573794d83a049fe59e289944f0cd77406dd776aRaph Levien private static native boolean nAddFontFromAsset(long nativeFamily, AssetManager mgr, 99d573794d83a049fe59e289944f0cd77406dd776aRaph Levien String path); 1001a73f732f91e97c9c66b808c245ddda36a10e987Raph Levien} 101