summaryrefslogtreecommitdiffstats
path: root/modules/woff2/src/woff2_out.cc
diff options
context:
space:
mode:
Diffstat (limited to 'modules/woff2/src/woff2_out.cc')
-rw-r--r--modules/woff2/src/woff2_out.cc63
1 files changed, 63 insertions, 0 deletions
diff --git a/modules/woff2/src/woff2_out.cc b/modules/woff2/src/woff2_out.cc
new file mode 100644
index 0000000000..a22d3bf8be
--- /dev/null
+++ b/modules/woff2/src/woff2_out.cc
@@ -0,0 +1,63 @@
+/* Copyright 2014 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Output buffer for WOFF2 decompression. */
+
+#include <woff2/output.h>
+
+namespace woff2 {
+
+WOFF2StringOut::WOFF2StringOut(std::string *buf)
+ : buf_(buf), max_size_(kDefaultMaxSize), offset_(0) {}
+
+bool WOFF2StringOut::Write(const void *buf, size_t n) {
+ return Write(buf, offset_, n);
+}
+
+bool WOFF2StringOut::Write(const void *buf, size_t offset, size_t n) {
+ if (offset > max_size_ || n > max_size_ - offset) {
+ return false;
+ }
+ if (offset == buf_->size()) {
+ buf_->append(static_cast<const char*>(buf), n);
+ } else {
+ if (offset + n > buf_->size()) {
+ buf_->append(offset + n - buf_->size(), 0);
+ }
+ buf_->replace(offset, n, static_cast<const char*>(buf), n);
+ }
+ offset_ = std::max(offset_, offset + n);
+
+ return true;
+}
+
+void WOFF2StringOut::SetMaxSize(size_t max_size) {
+ max_size_ = max_size;
+ if (offset_ > max_size_) {
+ offset_ = max_size_;
+ }
+}
+
+WOFF2MemoryOut::WOFF2MemoryOut(uint8_t* buf, size_t buf_size)
+ : buf_(buf),
+ buf_size_(buf_size),
+ offset_(0) {}
+
+bool WOFF2MemoryOut::Write(const void *buf, size_t n) {
+ return Write(buf, offset_, n);
+}
+
+bool WOFF2MemoryOut::Write(const void *buf, size_t offset, size_t n) {
+ if (offset > buf_size_ || n > buf_size_ - offset) {
+ return false;
+ }
+ std::memcpy(buf_ + offset, buf, n);
+ offset_ = std::max(offset_, offset + n);
+
+ return true;
+}
+
+} // namespace woff2