Index: src/kern.cc |
diff --git a/src/kern.cc b/src/kern.cc |
old mode 100644 |
new mode 100755 |
index c12d60854d0398977c61370d98d6f2feb9c78c04..a8c2a7599a19f6a63510e8adcd1ca35b52aa7f24 |
--- a/src/kern.cc |
+++ b/src/kern.cc |
@@ -5,10 +5,16 @@ |
#include "kern.h" |
// kern - Kerning |
-// http://www.microsoft.com/opentype/otspec/kern.htm |
+// http://www.microsoft.com/typography/otspec/kern.htm |
-#define DROP_THIS_TABLE \ |
- do { delete file->kern; file->kern = 0; } while (0) |
+#define TABLE_NAME "kern" |
+ |
+#define DROP_THIS_TABLE(msg_) \ |
+ do { \ |
+ delete file->kern; \ |
+ file->kern = 0; \ |
+ OTS_FAILURE_MSG(msg_ ", table discarded"); \ |
+ } while (0) |
namespace ots { |
@@ -21,17 +27,16 @@ bool ots_kern_parse(OpenTypeFile *file, const uint8_t *data, size_t length) { |
uint16_t num_tables = 0; |
if (!table.ReadU16(&kern->version) || |
!table.ReadU16(&num_tables)) { |
- return OTS_FAILURE(); |
+ return OTS_FAILURE_MSG("Failed to read kern header"); |
} |
if (kern->version > 0) { |
- DROP_THIS_TABLE; |
+ DROP_THIS_TABLE("bad table version"); |
return true; |
} |
if (num_tables == 0) { |
- OTS_WARNING("num_tables is zero"); |
- DROP_THIS_TABLE; |
+ DROP_THIS_TABLE("num_tables is zero"); |
return true; |
} |
@@ -42,7 +47,7 @@ bool ots_kern_parse(OpenTypeFile *file, const uint8_t *data, size_t length) { |
if (!table.ReadU16(&subtable.version) || |
!table.ReadU16(&sub_length)) { |
- return OTS_FAILURE(); |
+ return OTS_FAILURE_MSG("Failed to read kern subtable %d header", i); |
} |
if (subtable.version > 0) { |
@@ -52,11 +57,11 @@ bool ots_kern_parse(OpenTypeFile *file, const uint8_t *data, size_t length) { |
const size_t current_offset = table.offset(); |
if (current_offset - 4 + sub_length > length) { |
- return OTS_FAILURE(); |
+ return OTS_FAILURE_MSG("Bad kern subtable %d offset %ld", i, current_offset); |
} |
if (!table.ReadU16(&subtable.coverage)) { |
- return OTS_FAILURE(); |
+ return OTS_FAILURE_MSG("Cailed to read kern subtable %d coverage", i); |
} |
if (!(subtable.coverage & 0x1)) { |
@@ -65,8 +70,7 @@ bool ots_kern_parse(OpenTypeFile *file, const uint8_t *data, size_t length) { |
continue; |
} |
if (subtable.coverage & 0xF0) { |
- OTS_WARNING("Reserved fields should zero-filled."); |
- DROP_THIS_TABLE; |
+ DROP_THIS_TABLE("Reserved fields should zero-filled."); |
return true; |
} |
const uint32_t format = (subtable.coverage & 0xFF00) >> 8; |
@@ -81,12 +85,11 @@ bool ots_kern_parse(OpenTypeFile *file, const uint8_t *data, size_t length) { |
!table.ReadU16(&subtable.search_range) || |
!table.ReadU16(&subtable.entry_selector) || |
!table.ReadU16(&subtable.range_shift)) { |
- return OTS_FAILURE(); |
+ return OTS_FAILURE_MSG("Failed to read kern subtable %d format 0 fields", i); |
} |
if (!num_pairs) { |
- OTS_WARNING("Zero length subtable is found."); |
- DROP_THIS_TABLE; |
+ DROP_THIS_TABLE("Zero length subtable is found."); |
return true; |
} |
@@ -95,8 +98,7 @@ bool ots_kern_parse(OpenTypeFile *file, const uint8_t *data, size_t length) { |
const size_t kFormat0PairSize = 6; // left, right, and value. 2 bytes each. |
if (num_pairs > (65536 / kFormat0PairSize)) { |
// Some fonts (e.g. calibri.ttf, pykes_peak_zero.ttf) have pairs >= 10923. |
- OTS_WARNING("Too large subtable."); |
- DROP_THIS_TABLE; |
+ DROP_THIS_TABLE("Too large subtable."); |
return true; |
} |
unsigned max_pow2 = 0; |
@@ -109,7 +111,7 @@ bool ots_kern_parse(OpenTypeFile *file, const uint8_t *data, size_t length) { |
subtable.search_range = expected_search_range; |
} |
if (subtable.entry_selector != max_pow2) { |
- return OTS_FAILURE(); |
+ return OTS_FAILURE_MSG("Bad subtable %d entry selector %d", i, subtable.entry_selector); |
} |
const uint16_t expected_range_shift = |
kFormat0PairSize * num_pairs - subtable.search_range; |
@@ -126,15 +128,14 @@ bool ots_kern_parse(OpenTypeFile *file, const uint8_t *data, size_t length) { |
if (!table.ReadU16(&kerning_pair.left) || |
!table.ReadU16(&kerning_pair.right) || |
!table.ReadS16(&kerning_pair.value)) { |
- return OTS_FAILURE(); |
+ return OTS_FAILURE_MSG("Failed to read subtable %d kerning pair %d", i, j); |
} |
const uint32_t current_pair |
= (kerning_pair.left << 16) + kerning_pair.right; |
if (j != 0 && current_pair <= last_pair) { |
- OTS_WARNING("Kerning pairs are not sorted."); |
// Many free fonts don't follow this rule, so we don't call OTS_FAILURE |
// in order to support these fonts. |
- DROP_THIS_TABLE; |
+ DROP_THIS_TABLE("Kerning pairs are not sorted."); |
return true; |
} |
last_pair = current_pair; |
@@ -145,8 +146,7 @@ bool ots_kern_parse(OpenTypeFile *file, const uint8_t *data, size_t length) { |
} |
if (!kern->subtables.size()) { |
- OTS_WARNING("All subtables are removed."); |
- DROP_THIS_TABLE; |
+ DROP_THIS_TABLE("All subtables are removed."); |
return true; |
} |
@@ -165,7 +165,7 @@ bool ots_kern_serialise(OTSStream *out, OpenTypeFile *file) { |
if (num_subtables != kern->subtables.size() || |
!out->WriteU16(kern->version) || |
!out->WriteU16(num_subtables)) { |
- return OTS_FAILURE(); |
+ return OTS_FAILURE_MSG("Can't write kern table header"); |
} |
for (uint16_t i = 0; i < num_subtables; ++i) { |
@@ -179,13 +179,13 @@ bool ots_kern_serialise(OTSStream *out, OpenTypeFile *file) { |
!out->WriteU16(kern->subtables[i].search_range) || |
!out->WriteU16(kern->subtables[i].entry_selector) || |
!out->WriteU16(kern->subtables[i].range_shift)) { |
- return OTS_FAILURE(); |
+ return OTS_FAILURE_MSG("Failed to write kern subtable %d", i); |
} |
for (unsigned j = 0; j < kern->subtables[i].pairs.size(); ++j) { |
if (!out->WriteU16(kern->subtables[i].pairs[j].left) || |
!out->WriteU16(kern->subtables[i].pairs[j].right) || |
!out->WriteS16(kern->subtables[i].pairs[j].value)) { |
- return OTS_FAILURE(); |
+ return OTS_FAILURE_MSG("Failed to write kern pair %d for subtable %d", j, i); |
} |
} |
} |
@@ -198,3 +198,6 @@ void ots_kern_free(OpenTypeFile *file) { |
} |
} // namespace ots |
+ |
+#undef TABLE_NAME |
+#undef DROP_THIS_TABLE |