aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstuartg <stuartg@google.com>2013-01-16 00:13:56 +0000
committerstuartg <stuartg@google.com>2013-01-16 00:13:56 +0000
commit19596d2a164fdc88b2f88cf8e49eab55d7900746 (patch)
tree855bbde26ff5eb4129b5ab9abe23a77c62dfd037
parent7818928320510b811f104f52a1dddb031edd14bc (diff)
downloadsfntly-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/.classpath1
-rw-r--r--java/issue_tests/com/google/typography/font/sfntly/Issue27.java33
-rw-r--r--java/src/com/google/typography/font/sfntly/table/core/NameTable.java19
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;
}