Index: third_party/ots/include/opentype-sanitiser.h |
diff --git a/third_party/ots/include/opentype-sanitiser.h b/third_party/ots/include/opentype-sanitiser.h |
index 1c445ae00e42af577f8a13ffc318a07d12e5b617..285a438979ca704e712625e9225378c52f02c58d 100644 |
--- a/third_party/ots/include/opentype-sanitiser.h |
+++ b/third_party/ots/include/opentype-sanitiser.h |
@@ -29,6 +29,9 @@ typedef unsigned __int64 uint64_t; |
#include <cstddef> |
#include <cstring> |
+#define OTS_TAG(c1,c2,c3,c4) ((uint32_t)((((uint8_t)(c1))<<24)|(((uint8_t)(c2))<<16)|(((uint8_t)(c3))<<8)|((uint8_t)(c4)))) |
+#define OTS_UNTAG(tag) ((uint8_t)((tag)>>24)), ((uint8_t)((tag)>>16)), ((uint8_t)((tag)>>8)), ((uint8_t)(tag)) |
+ |
namespace ots { |
// ----------------------------------------------------------------------------- |
@@ -37,9 +40,7 @@ namespace ots { |
// ----------------------------------------------------------------------------- |
class OTSStream { |
public: |
- OTSStream() { |
- ResetChecksum(); |
- } |
+ OTSStream() : chksum_(0) {} |
virtual ~OTSStream() {} |
@@ -51,20 +52,15 @@ class OTSStream { |
const size_t orig_length = length; |
size_t offset = 0; |
- if (chksum_buffer_offset_) { |
- const size_t l = |
- std::min(length, static_cast<size_t>(4) - chksum_buffer_offset_); |
- std::memcpy(chksum_buffer_ + chksum_buffer_offset_, data, l); |
- chksum_buffer_offset_ += l; |
- offset += l; |
- length -= l; |
- } |
- if (chksum_buffer_offset_ == 4) { |
- uint32_t tmp; |
- std::memcpy(&tmp, chksum_buffer_, 4); |
+ size_t chksum_offset = Tell() & 3; |
+ if (chksum_offset) { |
+ const size_t l = std::min(length, static_cast<size_t>(4) - chksum_offset); |
+ uint32_t tmp = 0; |
+ std::memcpy(reinterpret_cast<uint8_t *>(&tmp) + chksum_offset, data, l); |
chksum_ += ntohl(tmp); |
- chksum_buffer_offset_ = 0; |
+ length -= l; |
+ offset += l; |
} |
while (length >= 4) { |
@@ -77,11 +73,11 @@ class OTSStream { |
} |
if (length) { |
- if (chksum_buffer_offset_ != 0) return false; // not reached |
if (length > 4) return false; // not reached |
- std::memcpy(chksum_buffer_, |
- reinterpret_cast<const uint8_t*>(data) + offset, length); |
- chksum_buffer_offset_ = length; |
+ uint32_t tmp = 0; |
+ std::memcpy(&tmp, |
+ reinterpret_cast<const uint8_t*>(data) + offset, length); |
+ chksum_ += ntohl(tmp); |
} |
return WriteRaw(data, orig_length); |
@@ -142,41 +138,16 @@ class OTSStream { |
} |
void ResetChecksum() { |
+ assert((Tell() & 3) == 0); |
chksum_ = 0; |
- chksum_buffer_offset_ = 0; |
} |
uint32_t chksum() const { |
- assert(chksum_buffer_offset_ == 0); |
return chksum_; |
} |
- struct ChecksumState { |
- uint32_t chksum; |
- uint8_t chksum_buffer[4]; |
- unsigned chksum_buffer_offset; |
- }; |
- |
- ChecksumState SaveChecksumState() const { |
- ChecksumState s; |
- s.chksum = chksum_; |
- s.chksum_buffer_offset = chksum_buffer_offset_; |
- std::memcpy(s.chksum_buffer, chksum_buffer_, 4); |
- |
- return s; |
- } |
- |
- void RestoreChecksum(const ChecksumState &s) { |
- assert(chksum_buffer_offset_ == 0); |
- chksum_ += s.chksum; |
- chksum_buffer_offset_ = s.chksum_buffer_offset; |
- std::memcpy(chksum_buffer_, s.chksum_buffer, 4); |
- } |
- |
protected: |
uint32_t chksum_; |
- uint8_t chksum_buffer_[4]; |
- unsigned chksum_buffer_offset_; |
}; |
#ifdef __GCC__ |
@@ -218,9 +189,6 @@ class OTSContext { |
virtual TableAction GetTableAction(uint32_t tag) { return ots::TABLE_ACTION_DEFAULT; } |
}; |
-// For backward compatibility - remove once Chrome switches over to the new API. |
-bool Process(OTSStream *output, const uint8_t *input, size_t length); |
- |
} // namespace ots |
#endif // OPENTYPE_SANITISER_H_ |