From 57de10b2fdd6e6f0bbca3aac03bce84d82cfaba3 Mon Sep 17 00:00:00 2001 From: Jeremias Maerki Date: Sat, 16 Feb 2008 12:28:48 +0000 Subject: [PATCH] Extracted most of the code in CodePointMapping (generated by XSLT) into a base class for easier maintenance and proper Javadocs. Deprecated FOP's copy of Glyphs.java. Took a different approach at handling mapping alternatives for single-byte fonts. The AFM now only lists the main character. Substitution is done through Glyphs.java later in CodePointMapping. Fixed a problem in Type1FontLoader where the PFM overrides asc/desc/cap/x even though the AFM provides the values. It showed itself because the URW Symbol font has wrong values in the PFM. Added a note to myself in Type1FontLoader to implement the "Flags" value. The whole thing still seems to work without that part. Added a glyph name list to the CodePointMapping so we can work with the original list from the AFM. Otherwise, various mapping operations to and from resulted in unwanted mappings (because the mappings are not necessarily 1:1) and in the end the PDF received an incorrect Encoding map. Now there's no such problem anymore. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@628280 13f79535-47bb-0310-9956-ffa450edef68 --- lib/xmlgraphics-commons-1.3svn.jar | Bin 500806 -> 510302 bytes src/codegen/fonts/code-point-mapping.xsl | 170 ++++++------ .../fop/fonts/AbstractCodePointMapping.java | 261 ++++++++++++++++++ src/java/org/apache/fop/fonts/Glyphs.java | 1 + .../org/apache/fop/fonts/SingleByteFont.java | 2 + .../apache/fop/fonts/truetype/TTFFile.java | 4 +- .../fop/fonts/type1/AFMCharMetrics.java | 25 +- .../org/apache/fop/fonts/type1/AFMFile.java | 14 +- .../org/apache/fop/fonts/type1/PFMFile.java | 2 +- .../fop/fonts/type1/Type1FontLoader.java | 40 ++- src/java/org/apache/fop/pdf/PDFFactory.java | 11 +- 11 files changed, 397 insertions(+), 133 deletions(-) create mode 100644 src/java/org/apache/fop/fonts/AbstractCodePointMapping.java diff --git a/lib/xmlgraphics-commons-1.3svn.jar b/lib/xmlgraphics-commons-1.3svn.jar index 80927dd7e4f306fec946c7010d48a1a84bfa68eb..55b9d9b2a0810e3daff4edfc424200ff834da743 100644 GIT binary patch delta 42198 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
E%ca*I&ha#g+=eM+3-p;Vx7e@a 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 diff --git a/src/codegen/fonts/code-point-mapping.xsl b/src/codegen/fonts/code-point-mapping.xsl index c82ca0104..55b84c742 100644 --- a/src/codegen/fonts/code-point-mapping.xsl +++ b/src/codegen/fonts/code-point-mapping.xsl @@ -40,100 +40,19 @@ package org.apache.fop.fonts; -import java.util.Arrays; import java.util.Map; import java.util.Collections; -import org.apache.fop.util.CharUtilities; - -public class CodePointMapping { +public class CodePointMapping extends AbstractCodePointMapping { - private String name; - private char[] latin1Map; - private char[] characters; - private char[] codepoints; - private char[] unicodeMap; //code point to Unicode char - public CodePointMapping(String name, int[] table) { - this.name = name; - int nonLatin1 = 0; - latin1Map = new char[256]; - unicodeMap = new char[256]; - Arrays.fill(unicodeMap, CharUtilities.NOT_A_CHARACTER); - for (int i = 0; i < table.length; i += 2) { - char unicode = (char)table[i + 1]; - if (unicode < 256) { - if (latin1Map[unicode] == 0) { - latin1Map[unicode] = (char) table[i]; - } - } else { - ++nonLatin1; - } - if (unicodeMap[table[i]] == CharUtilities.NOT_A_CHARACTER) { - unicodeMap[table[i]] = unicode; - } - } - characters = new char[nonLatin1]; - codepoints = new char[nonLatin1]; - int top = 0; - for (int i = 0; i < table.length; i += 2) { - char c = (char) table[i + 1]; - if (c >= 256) { - ++top; - for (int j = top - 1; j >= 0; --j) { - if (j > 0 && characters[j - 1] >= c) { - characters[j] = characters[j - 1]; - codepoints[j] = codepoints[j - 1]; - } else { - characters[j] = c; - codepoints[j] = (char) table[i]; - break; - } - } - } - } - } - - public String getName() { - return this.name; - } - - public final char mapChar(char c) { - if (c < 256) { - return latin1Map[c]; - } else { - int bot = 0, top = characters.length - 1; - while (top >= bot) { - int mid = (bot + top) / 2; - char mc = characters[mid]; - - if (c == mc) { - return codepoints[mid]; - } else if (c < mc) { - top = mid - 1; - } else { - bot = mid + 1; - } - } - return 0; - } - } - - public final char getUnicodeForIndex(int idx) { - return this.unicodeMap[idx]; + super(name, table); } - public final char[] getUnicodeCharMap() { - char[] copy = new char[this.unicodeMap.length]; - System.arraycopy(this.unicodeMap, 0, copy, 0, this.unicodeMap.length); - return copy; - } - - /** {@inheritDoc} */ - public String toString() { - return getName(); + public CodePointMapping(String name, int[] table, String[] charNameMap) { + super(name, table, charNameMap); } private static Map mappings; @@ -146,13 +65,10 @@ public class CodePointMapping { if (mapping != null) { return mapping; } - //TODO: Implement support for Expert and ExpertSubset encoding - else if (encoding.startsWith("Expert")) { - throw new UnsupportedOperationException(encoding + " not implemented yet"); - } throw new UnsupportedOperationException("Unknown encoding: " + encoding); } + } @@ -160,7 +76,7 @@ public class CodePointMapping { else if (encoding.equals()) { - mapping = new CodePointMapping(, enc); + mapping = new CodePointMapping(, enc, names); mappings.put(, mapping); return mapping; } @@ -178,4 +94,78 @@ public class CodePointMapping { }; + + + private static final String[] names + = { + + + + }; + + + + + + + + + + + + + + + + + + /**/ + + + + + + + "" + + null + + + + , + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/org/apache/fop/fonts/AbstractCodePointMapping.java b/src/java/org/apache/fop/fonts/AbstractCodePointMapping.java new file mode 100644 index 000000000..91d13da85 --- /dev/null +++ b/src/java/org/apache/fop/fonts/AbstractCodePointMapping.java @@ -0,0 +1,261 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.fonts; + +import java.util.Arrays; +import java.util.Map; + +import org.apache.xmlgraphics.fonts.Glyphs; + +import org.apache.fop.util.CharUtilities; + +/** + * Abstract base class for code point mapping classes (1-byte character encodings). + */ +public class AbstractCodePointMapping { + + private String name; + private char[] latin1Map; + private char[] characters; + private char[] codepoints; + private char[] unicodeMap; //code point to Unicode char + private String[] charNameMap; //all character names in the encoding + private Map fallbackMap; //Here we accumulate all mappings we have found through substitution + + /** + * Main constructor. + * @param name the name of the encoding + * @param table the table ([code point, unicode scalar value]+) with the mapping + */ + public AbstractCodePointMapping(String name, int[] table) { + this(name, table, null); + } + + /** + * Extended constructor. + * @param name the name of the encoding + * @param table the table ([code point, unicode scalar value]+) with the mapping + * @param charNameMap all character names in the encoding (a value of null will be converted + * to ".notdef") + */ + public AbstractCodePointMapping(String name, int[] table, String[] charNameMap) { + this.name = name; + buildFromTable(table); + if (charNameMap != null) { + this.charNameMap = new String[256]; + for (int i = 0; i < 256; i++) { + String charName = charNameMap[i]; + if (charName == null) { + this.charNameMap[i] = Glyphs.NOTDEF; + } else { + this.charNameMap[i] = charName; + } + } + } + } + + /** + * Builds the internal lookup structures based on a given table. + * @param table the table ([code point, unicode scalar value]+) with the mapping + */ + protected void buildFromTable(int[] table) { + int nonLatin1 = 0; + latin1Map = new char[256]; + unicodeMap = new char[256]; + Arrays.fill(unicodeMap, CharUtilities.NOT_A_CHARACTER); + for (int i = 0; i < table.length; i += 2) { + char unicode = (char)table[i + 1]; + if (unicode < 256) { + if (latin1Map[unicode] == 0) { + latin1Map[unicode] = (char) table[i]; + } + } else { + ++nonLatin1; + } + if (unicodeMap[table[i]] == CharUtilities.NOT_A_CHARACTER) { + unicodeMap[table[i]] = unicode; + } + } + characters = new char[nonLatin1]; + codepoints = new char[nonLatin1]; + int top = 0; + for (int i = 0; i < table.length; i += 2) { + char c = (char) table[i + 1]; + if (c >= 256) { + ++top; + for (int j = top - 1; j >= 0; --j) { + if (j > 0 && characters[j - 1] >= c) { + characters[j] = characters[j - 1]; + codepoints[j] = codepoints[j - 1]; + } else { + characters[j] = c; + codepoints[j] = (char) table[i]; + break; + } + } + } + } + } + + /** + * Returns the encoding's name. + * @return the name of the encoding + */ + public String getName() { + return this.name; + } + + /** + * Maps a Unicode character to a code point in the encoding. + * @param c the Unicode character to map + * @return the coid point in the encoding or 0 (=.notdef) if not found + */ + public final char mapChar(char c) { + if (c < 256) { + char latin1 = latin1Map[c]; + if (latin1 > 0) { + return latin1; + } + } + int bot = 0, top = characters.length - 1; + while (top >= bot) { + int mid = (bot + top) / 2; + char mc = characters[mid]; + + if (c == mc) { + return codepoints[mid]; + } else if (c < mc) { + top = mid - 1; + } else { + bot = mid + 1; + } + } + + //Fallback: using cache + synchronized (this) { + if (fallbackMap != null) { + Character fallback = (Character)fallbackMap.get(new Character(c)); + if (fallback != null) { + return fallback.charValue(); + } + } + } + //Fallback: find alternatives (slow!) + String glyphName = Glyphs.charToGlyphName(c); + if (glyphName.length() > 0) { + String[] alternatives = Glyphs.getCharNameAlternativesFor(glyphName); + if (alternatives != null) { + for (int i = 0, ic = alternatives.length; i < ic; i++) { + int idx = getCodePointForGlyph(alternatives[i]); + if (idx >= 0) { + putFallbackCharacter(c, (char)idx); + return (char)idx; + } + } + } + } + + putFallbackCharacter(c, '\0'); + return 0; + } + + private void putFallbackCharacter(char c, char mapTo) { + synchronized (this) { + if (this.fallbackMap == null) { + this.fallbackMap = new java.util.HashMap(); + } + this.fallbackMap.put(new Character(c), new Character(mapTo)); + } + } + + /** + * Returns the main Unicode value that is associated with the given code point in the encoding. + * Note that multiple Unicode values can theoretically be mapped to one code point in the + * encoding. + * @param idx the code point in the encoding + * @return the Unicode value (or \uFFFF (NOT A CHARACTER) if no Unicode value is at that point) + */ + public final char getUnicodeForIndex(int idx) { + return this.unicodeMap[idx]; + } + + /** + * Returns a character array with Unicode scalar values which can be used to map encoding + * code points to Unicode values. Note that this does not return all possible Unicode values + * that the encoding maps. + * @return a character array with Unicode scalar values + */ + public final char[] getUnicodeCharMap() { + char[] copy = new char[this.unicodeMap.length]; + System.arraycopy(this.unicodeMap, 0, copy, 0, this.unicodeMap.length); + return copy; + } + + /** + * Returns the index of a character/glyph with the given name. Note that this + * method is relatively slow and should only be used for fallback operations. + * @param charName the character name + * @return the index of the character in the encoding or -1 if it doesn't exist + */ + public short getCodePointForGlyph(String charName) { + String[] names = this.charNameMap; + if (names == null) { + names = getCharNameMap(); + } + for (short i = 0, c = (short)names.length; i < c; i++) { + if (names[i].equals(charName)) { + return i; + } + } + return -1; + } + + /** + * Returns the array of character names for this encoding. + * @return the array of character names + * (unmapped code points are represented by a ".notdef" value) + */ + public String[] getCharNameMap() { + if (this.charNameMap != null) { + String[] copy = new String[this.charNameMap.length]; + System.arraycopy(this.charNameMap, 0, copy, 0, this.charNameMap.length); + return copy; + } else { + //Note: this is suboptimal but will probably never be used. + String[] derived = new String[256]; + Arrays.fill(derived, Glyphs.NOTDEF); + for (int i = 0; i < 256; i++) { + char c = getUnicodeForIndex(i); + if (c != CharUtilities.NOT_A_CHARACTER) { + String charName = Glyphs.charToGlyphName(c); + if (charName.length() > 0) { + derived[i] = charName; + } + } + } + return derived; + } + } + + /** {@inheritDoc} */ + public String toString() { + return getName(); + } +} diff --git a/src/java/org/apache/fop/fonts/Glyphs.java b/src/java/org/apache/fop/fonts/Glyphs.java index e75a6bf54..4fb6c4e5c 100644 --- a/src/java/org/apache/fop/fonts/Glyphs.java +++ b/src/java/org/apache/fop/fonts/Glyphs.java @@ -21,6 +21,7 @@ package org.apache.fop.fonts; /** * This class provides a number of constants for glyph management. + * @deprecated Use the Glyphs class from XML Graphics Commons instead! */ public class Glyphs { diff --git a/src/java/org/apache/fop/fonts/SingleByteFont.java b/src/java/org/apache/fop/fonts/SingleByteFont.java index b6f65edc8..814d05a2c 100644 --- a/src/java/org/apache/fop/fonts/SingleByteFont.java +++ b/src/java/org/apache/fop/fonts/SingleByteFont.java @@ -24,6 +24,8 @@ import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.xmlgraphics.fonts.Glyphs; + /** * Generic SingleByte font */ diff --git a/src/java/org/apache/fop/fonts/truetype/TTFFile.java b/src/java/org/apache/fop/fonts/truetype/TTFFile.java index e46029709..fe40c4b33 100644 --- a/src/java/org/apache/fop/fonts/truetype/TTFFile.java +++ b/src/java/org/apache/fop/fonts/truetype/TTFFile.java @@ -27,8 +27,10 @@ import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + +import org.apache.xmlgraphics.fonts.Glyphs; + import org.apache.fop.fonts.FontUtil; -import org.apache.fop.fonts.Glyphs; /** * Reads a TrueType file or a TrueType Collection. diff --git a/src/java/org/apache/fop/fonts/type1/AFMCharMetrics.java b/src/java/org/apache/fop/fonts/type1/AFMCharMetrics.java index fbbff567e..1b7f814b8 100644 --- a/src/java/org/apache/fop/fonts/type1/AFMCharMetrics.java +++ b/src/java/org/apache/fop/fonts/type1/AFMCharMetrics.java @@ -28,7 +28,7 @@ import java.awt.geom.RectangularShape; public class AFMCharMetrics { private int charCode = -1; - private String unicodeChars; + private String unicodeSequence; private String charName; private double widthX; private double widthY; @@ -59,21 +59,20 @@ public class AFMCharMetrics { } /** - * Returns the Unicode characters represented by this object. Some character names can be - * mapped to multiple Unicode code points, so expect to find more than one character in the - * String. + * Returns the Unicode sequence for this character. * @return the Unicode characters + * (or null if no such Unicode sequence exists for this character) */ - public String getUnicodeChars() { - return this.unicodeChars; + public String getUnicodeSequence() { + return this.unicodeSequence; } /** - * Sets the Unicode characters represented by this object. - * @param unicodeChars the Unicode characters + * Sets the Unicode sequence for this character. + * @param unicodeSequence the Unicode sequence */ - public void setUnicodeChars(String unicodeChars) { - this.unicodeChars = unicodeChars; + public void setUnicodeSequence(String unicodeSequence) { + this.unicodeSequence = unicodeSequence; } /** @@ -145,9 +144,9 @@ public class AFMCharMetrics { StringBuffer sb = new StringBuffer("AFM Char: "); sb.append(getCharCode()); sb.append(" ("); - if (getUnicodeChars() != null) { - for (int i = 0, c = getUnicodeChars().length(); i < c; i++) { - sb.append("0x").append(Integer.toHexString(getUnicodeChars().charAt(i))); + if (getUnicodeSequence() != null) { + for (int i = 0, c = getUnicodeSequence().length(); i < c; i++) { + sb.append("0x").append(Integer.toHexString(getUnicodeSequence().charAt(i))); sb.append(", "); } } diff --git a/src/java/org/apache/fop/fonts/type1/AFMFile.java b/src/java/org/apache/fop/fonts/type1/AFMFile.java index 0b7b8d3c2..b51485485 100644 --- a/src/java/org/apache/fop/fonts/type1/AFMFile.java +++ b/src/java/org/apache/fop/fonts/type1/AFMFile.java @@ -21,7 +21,6 @@ package org.apache.fop.fonts.type1; import java.awt.geom.Dimension2D; import java.awt.geom.RectangularShape; -import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -315,18 +314,11 @@ public class AFMFile { */ public void addCharMetrics(AFMCharMetrics metrics) { String name = metrics.getCharName(); - if (metrics.getUnicodeChars() == null) { + if (metrics.getUnicodeSequence() == null) { if (name != null) { - String u = Glyphs.getUnicodeCodePointsForGlyphName(metrics.getCharName()); + String u = Glyphs.getUnicodeSequenceForGlyphName(metrics.getCharName()); if (u != null) { - if (u.length() > 1) { - //Lower values (ex. space) are most probably more interesting than - //higher values (ex. non-break-space), so sort just to be sure: - char[] chars = u.toCharArray(); - Arrays.sort(chars); - u = String.valueOf(chars); - } - metrics.setUnicodeChars(u); + metrics.setUnicodeSequence(u); } } else { //Ignore as no Unicode assignment is possible diff --git a/src/java/org/apache/fop/fonts/type1/PFMFile.java b/src/java/org/apache/fop/fonts/type1/PFMFile.java index a1e560746..69f8e836f 100644 --- a/src/java/org/apache/fop/fonts/type1/PFMFile.java +++ b/src/java/org/apache/fop/fonts/type1/PFMFile.java @@ -29,7 +29,7 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.fop.fonts.Glyphs; +import org.apache.xmlgraphics.fonts.Glyphs; /** * This class represents a PFM file (or parts of it) as a Java object. diff --git a/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java b/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java index 57383dc76..009a446f9 100644 --- a/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java +++ b/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java @@ -198,10 +198,18 @@ public class Type1FontLoader extends FontLoader { } if (pfm != null) { //Sometimes the PFM has these metrics while the AFM doesn't (ex. Symbol) - returnFont.setCapHeight(pfm.getCapHeight()); - returnFont.setXHeight(pfm.getXHeight()); - returnFont.setAscender(pfm.getLowerCaseAscent()); - returnFont.setDescender(pfm.getLowerCaseDescent()); + if (returnFont.getCapHeight() == 0) { + returnFont.setCapHeight(pfm.getCapHeight()); + } + if (returnFont.getXHeight(1) == 0) { + returnFont.setXHeight(pfm.getXHeight()); + } + if (returnFont.getAscender() == 0) { + returnFont.setAscender(pfm.getLowerCaseAscent()); + } + if (returnFont.getDescender() == 0) { + returnFont.setDescender(pfm.getLowerCaseDescent()); + } } //Fallbacks when some crucial font metrics aren't available @@ -253,6 +261,7 @@ public class Type1FontLoader extends FontLoader { } if (afm != null) { + //TODO returnFont.setFlags(flags); returnFont.setFirstChar(afm.getFirstChar()); returnFont.setLastChar(afm.getLastChar()); Iterator iter = afm.getCharMetrics().iterator(); @@ -264,9 +273,9 @@ public class Type1FontLoader extends FontLoader { } returnFont.replaceKerningMap(afm.createXKerningMapEncoded()); } else { + returnFont.setFlags(pfm.getFlags()); returnFont.setFirstChar(pfm.getFirstChar()); returnFont.setLastChar(pfm.getLastChar()); - returnFont.setFlags(pfm.getFlags()); for (short i = pfm.getFirstChar(); i <= pfm.getLastChar(); i++) { singleFont.setWidth(i, pfm.getCharWidth(i)); } @@ -282,28 +291,35 @@ public class Type1FontLoader extends FontLoader { while (iter.hasNext()) { AFMCharMetrics charMetrics = (AFMCharMetrics)iter.next(); if (charMetrics.getCharCode() >= 0) { - String u = charMetrics.getUnicodeChars(); - if (u != null) { - mappingCount += u.length(); + String u = charMetrics.getUnicodeSequence(); + if (u != null && u.length() == 1) { + mappingCount++; } } } //...and now build the table. int[] table = new int[mappingCount * 2]; + String[] charNameMap = new String[256]; iter = chars.iterator(); int idx = 0; while (iter.hasNext()) { AFMCharMetrics charMetrics = (AFMCharMetrics)iter.next(); if (charMetrics.getCharCode() >= 0) { - String unicodes = charMetrics.getUnicodeChars(); - for (int i = 0, c = unicodes.length(); i < c; i++) { + charNameMap[charMetrics.getCharCode()] = charMetrics.getCharName(); + String unicodes = charMetrics.getUnicodeSequence(); + if (unicodes == null) { + log.info("No Unicode mapping for glyph: " + charMetrics); + } else if (unicodes.length() == 1) { table[idx] = charMetrics.getCharCode(); idx++; - table[idx] = unicodes.charAt(i); + table[idx] = unicodes.charAt(0); idx++; + } else { + log.warn("Multi-character representation of glyph not currently supported: " + + charMetrics); } } } - return new CodePointMapping(encodingName, table); + return new CodePointMapping(encodingName, table, charNameMap); } } diff --git a/src/java/org/apache/fop/pdf/PDFFactory.java b/src/java/org/apache/fop/pdf/PDFFactory.java index a50ef2545..687b32016 100644 --- a/src/java/org/apache/fop/pdf/PDFFactory.java +++ b/src/java/org/apache/fop/pdf/PDFFactory.java @@ -40,7 +40,6 @@ import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.xmlgraphics.fonts.Glyphs; import org.apache.xmlgraphics.xmp.Metadata; import org.apache.fop.fonts.CIDFont; @@ -1252,15 +1251,17 @@ public class PDFFactory { PDFEncoding.DifferencesBuilder builder = pdfEncoding.createDifferencesBuilder(); int start = -1; + String[] winansiNames = winansi.getCharNameMap(); + String[] charNameMap = mapping.getCharNameMap(); for (int i = 0; i < 256; i++) { - char wac = winansi.getUnicodeForIndex(i); - char c = mapping.getUnicodeForIndex(i); - if (wac != c) { + String wac = winansiNames[i]; + String c = charNameMap[i]; + if (!wac.equals(c)) { if (start != i) { builder.addDifference(i); start = i; } - builder.addName(Glyphs.charToGlyphName(c)); + builder.addName(c); start++; } } -- 2.39.5