summaryrefslogtreecommitdiffstats
path: root/gfx/ots/src/vvar.cc
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@wolfbeast.com>2019-11-14 10:07:01 +0100
committerwolfbeast <mcwerewolf@wolfbeast.com>2019-11-14 10:07:01 +0100
commit0f8691a48869932cd3de5195f5211c25e4691b21 (patch)
tree829675d64c457be0b447dfbcf9534cc22f83d392 /gfx/ots/src/vvar.cc
parent36975f3865948f3faa959fe386e58b22783bd379 (diff)
downloadUXP-0f8691a48869932cd3de5195f5211c25e4691b21.tar
UXP-0f8691a48869932cd3de5195f5211c25e4691b21.tar.gz
UXP-0f8691a48869932cd3de5195f5211c25e4691b21.tar.lz
UXP-0f8691a48869932cd3de5195f5211c25e4691b21.tar.xz
UXP-0f8691a48869932cd3de5195f5211c25e4691b21.zip
Issue #1288 - Part 4: Update the OpenType Sanitizer component to 8.0.0
Diffstat (limited to 'gfx/ots/src/vvar.cc')
-rw-r--r--gfx/ots/src/vvar.cc95
1 files changed, 95 insertions, 0 deletions
diff --git a/gfx/ots/src/vvar.cc b/gfx/ots/src/vvar.cc
new file mode 100644
index 000000000..b47ea479d
--- /dev/null
+++ b/gfx/ots/src/vvar.cc
@@ -0,0 +1,95 @@
+// Copyright (c) 2018 The OTS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "vvar.h"
+
+#include "variations.h"
+
+namespace ots {
+
+// -----------------------------------------------------------------------------
+// OpenTypeVVAR
+// -----------------------------------------------------------------------------
+
+bool OpenTypeVVAR::Parse(const uint8_t* data, size_t length) {
+ Buffer table(data, length);
+
+ uint16_t majorVersion;
+ uint16_t minorVersion;
+ uint32_t itemVariationStoreOffset;
+ uint32_t advanceHeightMappingOffset;
+ uint32_t tsbMappingOffset;
+ uint32_t bsbMappingOffset;
+ uint32_t vOrgMappingOffset;
+
+ if (!table.ReadU16(&majorVersion) ||
+ !table.ReadU16(&minorVersion) ||
+ !table.ReadU32(&itemVariationStoreOffset) ||
+ !table.ReadU32(&advanceHeightMappingOffset) ||
+ !table.ReadU32(&tsbMappingOffset) ||
+ !table.ReadU32(&bsbMappingOffset) ||
+ !table.ReadU32(&vOrgMappingOffset)) {
+ return DropVariations("Failed to read table header");
+ }
+
+ if (majorVersion != 1) {
+ return DropVariations("Unknown table version");
+ }
+
+ if (itemVariationStoreOffset > length ||
+ advanceHeightMappingOffset > length ||
+ tsbMappingOffset > length ||
+ bsbMappingOffset > length ||
+ vOrgMappingOffset > length) {
+ return DropVariations("Invalid subtable offset");
+ }
+
+ if (!ParseItemVariationStore(GetFont(), data + itemVariationStoreOffset,
+ length - itemVariationStoreOffset)) {
+ return DropVariations("Failed to parse item variation store");
+ }
+
+ if (advanceHeightMappingOffset) {
+ if (!ParseDeltaSetIndexMap(GetFont(), data + advanceHeightMappingOffset,
+ length - advanceHeightMappingOffset)) {
+ return DropVariations("Failed to parse advance height mappings");
+ }
+ }
+
+ if (tsbMappingOffset) {
+ if (!ParseDeltaSetIndexMap(GetFont(), data + tsbMappingOffset,
+ length - tsbMappingOffset)) {
+ return DropVariations("Failed to parse TSB mappings");
+ }
+ }
+
+ if (bsbMappingOffset) {
+ if (!ParseDeltaSetIndexMap(GetFont(), data + bsbMappingOffset,
+ length - bsbMappingOffset)) {
+ return DropVariations("Failed to parse BSB mappings");
+ }
+ }
+
+ if (vOrgMappingOffset) {
+ if (!ParseDeltaSetIndexMap(GetFont(), data + vOrgMappingOffset,
+ length - vOrgMappingOffset)) {
+ return DropVariations("Failed to parse vOrg mappings");
+ }
+ }
+
+ this->m_data = data;
+ this->m_length = length;
+
+ return true;
+}
+
+bool OpenTypeVVAR::Serialize(OTSStream* out) {
+ if (!out->Write(this->m_data, this->m_length)) {
+ return Error("Failed to write VVAR table");
+ }
+
+ return true;
+}
+
+} // namespace ots