Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(439)

Unified Diff: src/kern.cc

Issue 658573004: Updating to new OTS repo from https://github.com/khaledhosny/ots.git (Closed) Base URL: https://chromium.googlesource.com/external/ots@master
Patch Set: Adding Colored Emoji changes from external/git repo Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« .gitmodules ('K') | « src/hmtx.cc ('k') | src/layout.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« .gitmodules ('K') | « src/hmtx.cc ('k') | src/layout.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698