summaryrefslogtreecommitdiffstats
path: root/modules/woff2/include/woff2/output.h
diff options
context:
space:
mode:
Diffstat (limited to 'modules/woff2/include/woff2/output.h')
-rw-r--r--modules/woff2/include/woff2/output.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/modules/woff2/include/woff2/output.h b/modules/woff2/include/woff2/output.h
new file mode 100644
index 0000000000..dc78ccf826
--- /dev/null
+++ b/modules/woff2/include/woff2/output.h
@@ -0,0 +1,86 @@
+/* Copyright 2016 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. */
+
+#ifndef WOFF2_WOFF2_OUT_H_
+#define WOFF2_WOFF2_OUT_H_
+
+#include <algorithm>
+#include <cstring>
+#include <memory>
+#include <string>
+
+namespace woff2 {
+
+// Suggested max size for output.
+const size_t kDefaultMaxSize = 30 * 1024 * 1024;
+
+/**
+ * Output interface for the woff2 decoding.
+ *
+ * Writes to arbitrary offsets are supported to facilitate updating offset
+ * table and checksums after tables are ready. Reading the current size is
+ * supported so a 'loca' table can be built up while writing glyphs.
+ *
+ * By default limits size to kDefaultMaxSize.
+ */
+class WOFF2Out {
+ public:
+ virtual ~WOFF2Out(void) {}
+
+ // Append n bytes of data from buf.
+ // Return true if all written, false otherwise.
+ virtual bool Write(const void *buf, size_t n) = 0;
+
+ // Write n bytes of data from buf at offset.
+ // Return true if all written, false otherwise.
+ virtual bool Write(const void *buf, size_t offset, size_t n) = 0;
+
+ virtual size_t Size() = 0;
+};
+
+/**
+ * Expanding memory block for woff2 out. By default limited to kDefaultMaxSize.
+ */
+class WOFF2StringOut : public WOFF2Out {
+ public:
+ // Create a writer that writes its data to buf.
+ // buf->size() will grow to at most max_size
+ // buf may be sized (e.g. using EstimateWOFF2FinalSize) or empty.
+ explicit WOFF2StringOut(std::string *buf);
+
+ bool Write(const void *buf, size_t n) override;
+ bool Write(const void *buf, size_t offset, size_t n) override;
+ size_t Size() override { return offset_; }
+ size_t MaxSize() { return max_size_; }
+ void SetMaxSize(size_t max_size);
+ private:
+ std::string *buf_;
+ size_t max_size_;
+ size_t offset_;
+};
+
+/**
+ * Fixed memory block for woff2 out.
+ */
+class WOFF2MemoryOut : public WOFF2Out {
+ public:
+ // Create a writer that writes its data to buf.
+ WOFF2MemoryOut(uint8_t* buf, size_t buf_size);
+
+ bool Write(const void *buf, size_t n) override;
+ bool Write(const void *buf, size_t offset, size_t n) override;
+ size_t Size() override { return offset_; }
+ private:
+ uint8_t* buf_;
+ size_t buf_size_;
+ size_t offset_;
+};
+
+} // namespace woff2
+
+#endif // WOFF2_WOFF2_OUT_H_