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 285a438979ca704e712625e9225378c52f02c58d..1c445ae00e42af577f8a13ffc318a07d12e5b617 100644 |
--- a/third_party/ots/include/opentype-sanitiser.h |
+++ b/third_party/ots/include/opentype-sanitiser.h |
@@ -29,9 +29,6 @@ |
#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 { |
// ----------------------------------------------------------------------------- |
@@ -40,7 +37,9 @@ |
// ----------------------------------------------------------------------------- |
class OTSStream { |
public: |
- OTSStream() : chksum_(0) {} |
+ OTSStream() { |
+ ResetChecksum(); |
+ } |
virtual ~OTSStream() {} |
@@ -52,15 +51,20 @@ |
const size_t orig_length = length; |
size_t offset = 0; |
- |
- 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); |
+ 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); |
chksum_ += ntohl(tmp); |
- length -= l; |
- offset += l; |
+ chksum_buffer_offset_ = 0; |
} |
while (length >= 4) { |
@@ -73,11 +77,11 @@ |
} |
if (length) { |
+ if (chksum_buffer_offset_ != 0) return false; // not reached |
if (length > 4) return false; // not reached |
- uint32_t tmp = 0; |
- std::memcpy(&tmp, |
- reinterpret_cast<const uint8_t*>(data) + offset, length); |
- chksum_ += ntohl(tmp); |
+ std::memcpy(chksum_buffer_, |
+ reinterpret_cast<const uint8_t*>(data) + offset, length); |
+ chksum_buffer_offset_ = length; |
} |
return WriteRaw(data, orig_length); |
@@ -138,16 +142,41 @@ |
} |
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__ |
@@ -189,6 +218,9 @@ |
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_ |