1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.graphics; 18 19 import android.annotation.Nullable; 20 import android.compat.annotation.UnsupportedAppUsage; 21 import android.content.res.AssetManager; 22 import android.graphics.fonts.Font; 23 import android.graphics.fonts.FontVariationAxis; 24 import android.os.Build; 25 import android.text.TextUtils; 26 27 import dalvik.annotation.optimization.CriticalNative; 28 29 import libcore.util.NativeAllocationRegistry; 30 31 import java.io.FileInputStream; 32 import java.io.IOException; 33 import java.nio.ByteBuffer; 34 import java.nio.channels.FileChannel; 35 36 /** 37 * A family of typefaces with different styles. 38 * 39 * @hide 40 * 41 * @deprecated Use {@link android.graphics.fonts.FontFamily} instead. 42 */ 43 @Deprecated 44 public class FontFamily { 45 46 private static String TAG = "FontFamily"; 47 48 private static final NativeAllocationRegistry sBuilderRegistry = 49 NativeAllocationRegistry.createMalloced( 50 FontFamily.class.getClassLoader(), nGetBuilderReleaseFunc()); 51 52 private @Nullable Runnable mNativeBuilderCleaner; 53 54 private static final NativeAllocationRegistry sFamilyRegistry = 55 NativeAllocationRegistry.createMalloced( 56 FontFamily.class.getClassLoader(), nGetFamilyReleaseFunc()); 57 58 /** 59 * @hide 60 * 61 * This cannot be deleted because it's in use by AndroidX. 62 */ 63 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q, 64 publicAlternatives = "Use {@link android.graphics.fonts.FontFamily} instead.") 65 public long mNativePtr; 66 67 // Points native font family builder. Must be zero after freezing this family. 68 private long mBuilderPtr; 69 70 /** 71 * This cannot be deleted because it's in use by AndroidX. 72 */ 73 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q, 74 publicAlternatives = "Use {@link android.graphics.fonts.FontFamily} instead.") FontFamily()75 public FontFamily() { 76 mBuilderPtr = nInitBuilder(null, 0); 77 mNativeBuilderCleaner = sBuilderRegistry.registerNativeAllocation(this, mBuilderPtr); 78 } 79 80 /** 81 * This cannot be deleted because it's in use by AndroidX. 82 */ 83 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q, 84 publicAlternatives = "Use {@link android.graphics.fonts.FontFamily} instead.") FontFamily(@ullable String[] langs, int variant)85 public FontFamily(@Nullable String[] langs, int variant) { 86 final String langsString; 87 if (langs == null || langs.length == 0) { 88 langsString = null; 89 } else if (langs.length == 1) { 90 langsString = langs[0]; 91 } else { 92 langsString = TextUtils.join(",", langs); 93 } 94 mBuilderPtr = nInitBuilder(langsString, variant); 95 mNativeBuilderCleaner = sBuilderRegistry.registerNativeAllocation(this, mBuilderPtr); 96 } 97 98 /** 99 * Finalize the FontFamily creation. 100 * 101 * @return boolean returns false if some error happens in native code, e.g. broken font file is 102 * passed, etc. 103 * 104 * This cannot be deleted because it's in use by AndroidX. 105 */ 106 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q, 107 publicAlternatives = "Use {@link android.graphics.fonts.FontFamily} instead.") freeze()108 public boolean freeze() { 109 if (mBuilderPtr == 0) { 110 throw new IllegalStateException("This FontFamily is already frozen"); 111 } 112 mNativePtr = nCreateFamily(mBuilderPtr); 113 mNativeBuilderCleaner.run(); 114 mBuilderPtr = 0; 115 if (mNativePtr != 0) { 116 sFamilyRegistry.registerNativeAllocation(this, mNativePtr); 117 } 118 return mNativePtr != 0; 119 } 120 121 /** 122 * This cannot be deleted because it's in use by AndroidX. 123 */ 124 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q, 125 publicAlternatives = "Use {@link android.graphics.fonts.FontFamily} instead.") abortCreation()126 public void abortCreation() { 127 if (mBuilderPtr == 0) { 128 throw new IllegalStateException("This FontFamily is already frozen or abandoned"); 129 } 130 mNativeBuilderCleaner.run(); 131 mBuilderPtr = 0; 132 } 133 134 /** 135 * This cannot be deleted because it's in use by AndroidX. 136 */ 137 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q, 138 publicAlternatives = "Use {@link android.graphics.fonts.FontFamily} instead.") addFont(String path, int ttcIndex, FontVariationAxis[] axes, int weight, int italic)139 public boolean addFont(String path, int ttcIndex, FontVariationAxis[] axes, int weight, 140 int italic) { 141 if (mBuilderPtr == 0) { 142 throw new IllegalStateException("Unable to call addFont after freezing."); 143 } 144 try (FileInputStream file = new FileInputStream(path)) { 145 FileChannel fileChannel = file.getChannel(); 146 long fontSize = fileChannel.size(); 147 ByteBuffer fontBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fontSize); 148 if (axes != null) { 149 for (FontVariationAxis axis : axes) { 150 nAddAxisValue(mBuilderPtr, axis.getOpenTypeTagValue(), axis.getStyleValue()); 151 } 152 } 153 return nAddFont(mBuilderPtr, fontBuffer, ttcIndex, weight, italic); 154 } catch (IOException e) { 155 return false; 156 } 157 } 158 159 /** 160 * This cannot be deleted because it's in use by AndroidX. 161 */ 162 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q, 163 publicAlternatives = "Use {@link android.graphics.fonts.FontFamily} instead.") addFontFromBuffer(ByteBuffer font, int ttcIndex, FontVariationAxis[] axes, int weight, int italic)164 public boolean addFontFromBuffer(ByteBuffer font, int ttcIndex, FontVariationAxis[] axes, 165 int weight, int italic) { 166 if (mBuilderPtr == 0) { 167 throw new IllegalStateException("Unable to call addFontWeightStyle after freezing."); 168 } 169 if (axes != null) { 170 for (FontVariationAxis axis : axes) { 171 nAddAxisValue(mBuilderPtr, axis.getOpenTypeTagValue(), axis.getStyleValue()); 172 } 173 } 174 return nAddFontWeightStyle(mBuilderPtr, font, ttcIndex, weight, italic); 175 } 176 177 /** 178 * @param mgr The AssetManager to use for this context. 179 * @param path The path to the font file to load. 180 * @param cookie If available, the resource cookie given by Resources. 181 * @param isAsset {@code true} if this is from the assets/ folder, {@code false} if from 182 * resources 183 * @param weight The weight of the font. If 0 is given, the weight and italic will be resolved 184 * using the OS/2 table in the font. 185 * @param isItalic Whether this font is italic. If the weight is set to 0, this will be resolved 186 * using the OS/2 table in the font. 187 * @return 188 * 189 * This cannot be deleted because it's in use by AndroidX. 190 */ 191 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.Q, 192 publicAlternatives = "Use {@link android.graphics.fonts.FontFamily} instead.") addFontFromAssetManager(AssetManager mgr, String path, int cookie, boolean isAsset, int ttcIndex, int weight, int isItalic, FontVariationAxis[] axes)193 public boolean addFontFromAssetManager(AssetManager mgr, String path, int cookie, 194 boolean isAsset, int ttcIndex, int weight, int isItalic, 195 FontVariationAxis[] axes) { 196 if (mBuilderPtr == 0) { 197 throw new IllegalStateException("Unable to call addFontFromAsset after freezing."); 198 } 199 200 try { 201 ByteBuffer buffer = Font.Builder.createBuffer(mgr, path, isAsset, cookie); 202 return addFontFromBuffer(buffer, ttcIndex, axes, weight, isItalic); 203 } catch (IOException e) { 204 return false; 205 } 206 } 207 nInitBuilder(String langs, int variant)208 private static native long nInitBuilder(String langs, int variant); 209 210 @CriticalNative nCreateFamily(long mBuilderPtr)211 private static native long nCreateFamily(long mBuilderPtr); 212 213 @CriticalNative nGetBuilderReleaseFunc()214 private static native long nGetBuilderReleaseFunc(); 215 216 @CriticalNative nGetFamilyReleaseFunc()217 private static native long nGetFamilyReleaseFunc(); 218 // By passing -1 to weigth argument, the weight value is resolved by OS/2 table in the font. 219 // By passing -1 to italic argument, the italic value is resolved by OS/2 table in the font. nAddFont(long builderPtr, ByteBuffer font, int ttcIndex, int weight, int isItalic)220 private static native boolean nAddFont(long builderPtr, ByteBuffer font, int ttcIndex, 221 int weight, int isItalic); nAddFontWeightStyle(long builderPtr, ByteBuffer font, int ttcIndex, int weight, int isItalic)222 private static native boolean nAddFontWeightStyle(long builderPtr, ByteBuffer font, 223 int ttcIndex, int weight, int isItalic); 224 225 // The added axis values are only valid for the next nAddFont* method call. 226 @CriticalNative nAddAxisValue(long builderPtr, int tag, float value)227 private static native void nAddAxisValue(long builderPtr, int tag, float value); 228 } 229