vvar.cc (2849B)
1 // Copyright (c) 2018 The OTS Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "vvar.h" 6 7 #include "variations.h" 8 9 namespace ots { 10 11 // ----------------------------------------------------------------------------- 12 // OpenTypeVVAR 13 // ----------------------------------------------------------------------------- 14 15 bool OpenTypeVVAR::Parse(const uint8_t* data, size_t length) { 16 Buffer table(data, length); 17 18 uint16_t majorVersion; 19 uint16_t minorVersion; 20 uint32_t itemVariationStoreOffset; 21 uint32_t advanceHeightMappingOffset; 22 uint32_t tsbMappingOffset; 23 uint32_t bsbMappingOffset; 24 uint32_t vOrgMappingOffset; 25 26 if (!table.ReadU16(&majorVersion) || 27 !table.ReadU16(&minorVersion) || 28 !table.ReadU32(&itemVariationStoreOffset) || 29 !table.ReadU32(&advanceHeightMappingOffset) || 30 !table.ReadU32(&tsbMappingOffset) || 31 !table.ReadU32(&bsbMappingOffset) || 32 !table.ReadU32(&vOrgMappingOffset)) { 33 return DropVariations("Failed to read table header"); 34 } 35 36 if (majorVersion != 1) { 37 return DropVariations("Unknown table version"); 38 } 39 40 if (itemVariationStoreOffset > length || 41 advanceHeightMappingOffset > length || 42 tsbMappingOffset > length || 43 bsbMappingOffset > length || 44 vOrgMappingOffset > length) { 45 return DropVariations("Invalid subtable offset"); 46 } 47 48 if (!ParseItemVariationStore(GetFont(), data + itemVariationStoreOffset, 49 length - itemVariationStoreOffset)) { 50 return DropVariations("Failed to parse item variation store"); 51 } 52 53 if (advanceHeightMappingOffset) { 54 if (!ParseDeltaSetIndexMap(GetFont(), data + advanceHeightMappingOffset, 55 length - advanceHeightMappingOffset)) { 56 return DropVariations("Failed to parse advance height mappings"); 57 } 58 } 59 60 if (tsbMappingOffset) { 61 if (!ParseDeltaSetIndexMap(GetFont(), data + tsbMappingOffset, 62 length - tsbMappingOffset)) { 63 return DropVariations("Failed to parse TSB mappings"); 64 } 65 } 66 67 if (bsbMappingOffset) { 68 if (!ParseDeltaSetIndexMap(GetFont(), data + bsbMappingOffset, 69 length - bsbMappingOffset)) { 70 return DropVariations("Failed to parse BSB mappings"); 71 } 72 } 73 74 if (vOrgMappingOffset) { 75 if (!ParseDeltaSetIndexMap(GetFont(), data + vOrgMappingOffset, 76 length - vOrgMappingOffset)) { 77 return DropVariations("Failed to parse vOrg mappings"); 78 } 79 } 80 81 this->m_data = data; 82 this->m_length = length; 83 84 return true; 85 } 86 87 bool OpenTypeVVAR::Serialize(OTSStream* out) { 88 if (!out->Write(this->m_data, this->m_length)) { 89 return Error("Failed to write VVAR table"); 90 } 91 92 return true; 93 } 94 95 } // namespace ots