1 /*
2  * Copyright (C) 2018 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.fonts;
18 
19 import android.util.Pair;
20 
21 import java.io.File;
22 import java.io.IOException;
23 import java.util.HashSet;
24 import java.util.Set;
25 
26 public class NativeSystemFontHelper {
27     static {
28         System.loadLibrary("ctsgraphics_jni");
29     }
30 
tagToStr(int tag)31     private static String tagToStr(int tag) {
32         char[] buf = new char[4];
33         buf[0] = (char) ((tag >> 24) & 0xFF);
34         buf[1] = (char) ((tag >> 16) & 0xFF);
35         buf[2] = (char) ((tag >> 8) & 0xFF);
36         buf[3] = (char) (tag & 0xFF);
37         return String.valueOf(buf);
38     }
39 
getAvailableFonts()40     public static Set<Font> getAvailableFonts() {
41         long iterPtr = nOpenIterator();
42         HashSet<Font> nativeFonts = new HashSet<>();
43         try {
44             for (long fontPtr = nNext(iterPtr); fontPtr != 0; fontPtr = nNext(iterPtr)) {
45                 try {
46                     FontVariationAxis[] axes = new FontVariationAxis[nGetAxisCount(fontPtr)];
47                     for (int i = 0; i < axes.length; ++i) {
48                         axes[i] = new FontVariationAxis(
49                                 tagToStr(nGetAxisTag(fontPtr, i)), nGetAxisValue(fontPtr, i));
50                     }
51                     nativeFonts.add(new Font.Builder(new File(nGetFilePath(fontPtr)))
52                             .setWeight(nGetWeight(fontPtr))
53                             .setSlant(nIsItalic(fontPtr)
54                                     ?  FontStyle.FONT_SLANT_ITALIC : FontStyle.FONT_SLANT_UPRIGHT)
55                             .setTtcIndex(nGetCollectionIndex(fontPtr))
56                             .setFontVariationSettings(axes)
57                             .build());
58                 } catch (IOException e) {
59                     throw new RuntimeException(e);
60                 } finally {
61                     nCloseFont(fontPtr);
62                 }
63             }
64         } finally {
65             nCloseIterator(iterPtr);
66         }
67         return nativeFonts;
68     }
69 
matchFamilyStyleCharacter(String familyName, int weight, boolean italic, String languageTags, int familyVariant, String text)70     public static Pair<File, Integer> matchFamilyStyleCharacter(String familyName, int weight,
71             boolean italic, String languageTags, int familyVariant, String text) {
72         final long fontPtr = nMatchFamilyStyleCharacter(familyName, weight, italic, languageTags,
73                 familyVariant, text);
74         final int runLength = nMatchFamilyStyleCharacter_runLength(familyName, weight, italic,
75                 languageTags, familyVariant, text);
76         try {
77             return new Pair<>(new File(nGetFilePath(fontPtr)), runLength);
78         } finally {
79             nCloseFont(fontPtr);
80         }
81     }
82 
nOpenIterator()83     private static native long nOpenIterator();
nCloseIterator(long ptr)84     private static native void nCloseIterator(long ptr);
nNext(long ptr)85     private static native long nNext(long ptr);
nCloseFont(long ptr)86     private static native void nCloseFont(long ptr);
nGetFilePath(long ptr)87     private static native String nGetFilePath(long ptr);
nGetWeight(long ptr)88     private static native int nGetWeight(long ptr);
nIsItalic(long ptr)89     private static native boolean nIsItalic(long ptr);
nGetLocale(long ptr)90     private static native String nGetLocale(long ptr);
nGetCollectionIndex(long ptr)91     private static native int nGetCollectionIndex(long ptr);
nGetAxisCount(long ptr)92     private static native int nGetAxisCount(long ptr);
nGetAxisTag(long ptr, int index)93     private static native int nGetAxisTag(long ptr, int index);
nGetAxisValue(long ptr, int index)94     private static native float nGetAxisValue(long ptr, int index);
nMatchFamilyStyleCharacter(String familyName, int weight, boolean italic, String languageTags, int familyVariant, String text)95     private static native long nMatchFamilyStyleCharacter(String familyName, int weight,
96             boolean italic, String languageTags, int familyVariant, String text);
nMatchFamilyStyleCharacter_runLength(String familyName, int weight, boolean italic, String languageTags, int familyVariant, String text)97     private static native int nMatchFamilyStyleCharacter_runLength(String familyName, int weight,
98             boolean italic, String languageTags, int familyVariant, String text);
99 }
100