kunfei 4 năm trước cách đây
mục cha
commit
fa6a6d00ba
1 tập tin đã thay đổi với 12 bổ sung và 10 xóa
  1. 12 10
      app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java

+ 12 - 10
app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java

@@ -535,17 +535,19 @@ public class QueryTTF {
         } else if (fmt == 4) {
             CmapFormat4 tab = (CmapFormat4) table;
             if (code > tab.endCode[tab.endCode.length - 1]) return 0;
-            for (int i = 0; i < tab.endCode.length; i++) {
-                if (tab.endCode[i] == code) {
-                    if (tab.endCode[i] < code) ++i;
-                    if (code < tab.startCode[i]) return 0;
-                    if (tab.idRangeOffset[i] != 0) {
-                        glyfID = tab.glyphIdArray[code - tab.startCode[i] + (tab.idRangeOffset[i] >> 1) - (tab.idRangeOffset.length - i)];
-                    } else glyfID = code + tab.idDelta[i];
-                    glyfID &= 0xFFFF;
-                    break;
-                }
+            // 二分法查找数值索引
+            int start = 0, middle, end = tab.endCode.length - 1;
+            while (start + 1 < end) {
+                middle = (start + end) / 2;
+                if (tab.endCode[middle] <= code) start = middle;
+                else end = middle;
             }
+            if (tab.endCode[start] < code) ++start;
+            if (code < tab.startCode[start]) return 0;
+            if (tab.idRangeOffset[start] != 0) {
+                glyfID = tab.glyphIdArray[code - tab.startCode[start] + (tab.idRangeOffset[start] >> 1) - (tab.idRangeOffset.length - start)];
+            } else glyfID = code + tab.idDelta[start];
+            glyfID &= 0xFFFF;
         } else if (fmt == 6) {
             CmapFormat6 tab = (CmapFormat6) table;
             int index = code - tab.firstCode;