diff options
author | stuartg <stuartg@google.com> | 2013-01-16 00:13:56 +0000 |
---|---|---|
committer | stuartg <stuartg@google.com> | 2013-01-16 00:13:56 +0000 |
commit | 19596d2a164fdc88b2f88cf8e49eab55d7900746 (patch) | |
tree | 855bbde26ff5eb4129b5ab9abe23a77c62dfd037 | |
parent | 7818928320510b811f104f52a1dddb031edd14bc (diff) | |
download | sfntly-19596d2a164fdc88b2f88cf8e49eab55d7900746.tar.gz |
ticket:27 fix issue of zero length name entry being added at the end of the name table
-rw-r--r-- | java/.classpath | 1 | ||||
-rw-r--r-- | java/issue_tests/com/google/typography/font/sfntly/Issue27.java | 33 | ||||
-rw-r--r-- | java/src/com/google/typography/font/sfntly/table/core/NameTable.java | 19 |
3 files changed, 51 insertions, 2 deletions
diff --git a/java/.classpath b/java/.classpath index b7e8099..5faa3ff 100644 --- a/java/.classpath +++ b/java/.classpath @@ -2,6 +2,7 @@ <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="src" path="test"/> + <classpathentry kind="src" path="issue_tests"/> <classpathentry kind="lib" path="lib/icu4j-4_8_1_1.jar"/> <classpathentry kind="lib" path="lib/icu4j-charset-4_8_1_1.jar"/> <classpathentry kind="lib" path="lib/junit-4.10.jar"/> diff --git a/java/issue_tests/com/google/typography/font/sfntly/Issue27.java b/java/issue_tests/com/google/typography/font/sfntly/Issue27.java new file mode 100644 index 0000000..eb71f45 --- /dev/null +++ b/java/issue_tests/com/google/typography/font/sfntly/Issue27.java @@ -0,0 +1,33 @@ +package com.google.typography.font.sfntly; + +import com.google.typography.font.sfntly.Font; +import com.google.typography.font.sfntly.FontFactory; +import com.google.typography.font.sfntly.Tag; +import com.google.typography.font.sfntly.table.core.NameTable; +import com.google.typography.font.sfntly.testutils.TestFont; + +import java.io.File; +import java.io.FileInputStream; + +import junit.framework.TestCase; + +/* + * Test for Issue 27. + * Adding a zero length name that sorts at the end of the name table. + * http://code.google.com/p/sfntly/issues/detail?id=27 + */ +public class Issue27 extends TestCase { + + private static final File fontFile = TestFont.TestFontNames.OPENSANS.getFile(); + + public void testIssue27() throws Exception { + FontFactory fontFactory = FontFactory.getInstance(); + Font.Builder fontBuilder = fontFactory.loadFontsForBuilding(new FileInputStream(fontFile))[0]; + NameTable.Builder nameTableBuilder = (NameTable.Builder) fontBuilder.getTableBuilder(Tag.name); + // add a name that will sort after all the other names in the table + nameTableBuilder.nameBuilder(Font.PlatformId.Windows.value(), Font.WindowsEncodingId.UnicodeUCS4.value(), + NameTable.WindowsLanguageId.Spanish_UnitedStates.value(), NameTable.NameId.WWSSubfamilyName.value()).setName(""); + Font font = fontBuilder.build(); + assertNotNull(font); + } +} diff --git a/java/src/com/google/typography/font/sfntly/table/core/NameTable.java b/java/src/com/google/typography/font/sfntly/table/core/NameTable.java index 704248b..63ff6e4 100644 --- a/java/src/com/google/typography/font/sfntly/table/core/NameTable.java +++ b/java/src/com/google/typography/font/sfntly/table/core/NameTable.java @@ -750,9 +750,21 @@ public final class NameTable extends SubTableContainerTable implements Iterable< } private static class NameEntryId implements Comparable<NameEntryId> { + /* @see Font.PlatformId + */ protected int platformId; + /* @see Font.UnicodeEncodingId + * @see Font.MacintoshEncodingId + * @see Font.WindowsEncodingId + */ protected int encodingId; + /* @see NameTable.UnicodeLanguageId + * @see NameTable.MacintoshLanguageId + * @see NameTable.WindowsLanguageId + */ protected int languageId; + /* @see NameTable.NameId + */ protected int nameId; /** @@ -1425,8 +1437,11 @@ public final class NameTable extends SubTableContainerTable implements Iterable< nameRecordOffset + NameTable.Offset.nameRecordStringOffset.offset, stringOffset); nameRecordOffset += NameTable.Offset.nameRecordSize.offset; // string table - stringOffset += newData.writeBytes( - stringOffset + stringTableStartOffset, entry.getValue().nameAsBytes()); + byte[] nameBytes = entry.getValue().nameAsBytes(); + if (nameBytes.length > 0) { + stringOffset += newData.writeBytes( + stringOffset + stringTableStartOffset, entry.getValue().nameAsBytes()); + } } return stringOffset + stringTableStartOffset; } |