diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java b/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java index a1948e6cc..85ab546d0 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java +++ b/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java @@ -773,12 +773,12 @@ public class QueryTTF { var dataTable = directorys.get("glyf"); assert dataTable != null; int glyfCount = maxp.numGlyphs; - glyfArray = new GlyfLayout[glyfCount + 1]; // 创建容器时,多创建一个作为保留区 + glyfArray = new GlyfLayout[glyfCount]; // 创建字形容器 var reader = new BufferReader(buffer, 0); - for (int index = 1; index <= glyfCount; index++) { - if (loca[index - 1] == loca[index]) continue; // 当前loca与下一个loca相同,表示这个字形不存在 - int offset = dataTable.offset + loca[index - 1]; + for (int index = 0; index < glyfCount; index++) { + if (loca[index] == loca[index + 1]) continue; // 当前loca与下一个loca相同,表示这个字形不存在 + int offset = dataTable.offset + loca[index]; // 读GlyphHeaders var glyph = new GlyfLayout(); reader.position(offset); @@ -893,7 +893,7 @@ public class QueryTTF { if ((glyphTableComponent.flags & 0x20) == 0) break; } } - glyfArray[index] = glyph; // 根据文档 glyfId=0 作为保留区使用,这里赋值从索引1开始 + glyfArray[index] = glyph; } } @@ -919,7 +919,15 @@ public class QueryTTF { // 复合字形 LinkedList glyphIdList = new LinkedList<>(); for (var g : glyph.glyphComponent) { - glyphIdList.add(String.valueOf(g.glyphIndex)); + glyphIdList.add("{" + + "flags:" + g.flags + "," + + "glyphIndex:" + g.glyphIndex + "," + + "arg1:" + g.argument1 + "," + + "arg2:" + g.argument2 + "," + + "xScale:" + g.xScale + "," + + "scale01:" + g.scale01 + "," + + "scale10:" + g.scale10 + "," + + "yScale:" + g.yScale + "}"); } glyphString = "[" + String.join(",", glyphIdList) + "]"; } @@ -965,10 +973,11 @@ public class QueryTTF { int glyfArrayLength = glyfArray.length; for (var item : unicodeToGlyphId.entrySet()) { int key = item.getKey(); - int val = item.getValue() + 1; // glyphArray已根据TTF文档将索引0作为保留位,这里从1开始索引 + int val = item.getValue(); if (val >= glyfArrayLength) continue; String glyfString = getGlyfById(val); unicodeToGlyph.put(key, glyfString); + if (glyfString == null) continue; // null 不能用作hashmap的key glyphToUnicode.put(glyfString, key); } // Log.i("QueryTTF", "字体处理完成"); @@ -986,8 +995,8 @@ public class QueryTTF { */ public int getGlyfIdByUnicode(int unicode) { var result = unicodeToGlyphId.get(unicode); - if (result == null) return 0; - return result + 1; // 根据TTF文档,轮廓索引的定义从1开始 + if (result == null) return 0; // 如果找不到Unicode对应的轮廓索引,就返回默认值0 + return result; } /** @@ -1008,7 +1017,7 @@ public class QueryTTF { */ public int getUnicodeByGlyf(String glyph) { var result = glyphToUnicode.get(glyph); - if (result == null) return 0; + if (result == null) return 0; // 如果轮廓数据找不到对应的Unicode,就返回默认值0 return result; }