| 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
|
|
|