1d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// Use of this source code is governed by a BSD-style license that can be 3d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// found in the LICENSE file. 4d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 5d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#ifndef OTS_H_ 6d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define OTS_H_ 7d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 87f9bebe3906fb30f0632f9d010754d12dd6c02d7yusukes@chromium.org#include <stddef.h> 9d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include <cstdarg> 10cd35d0324e9cb7d46625ea1c0990dc75c69fc835bashi@chromium.org#include <cstddef> 11d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include <cstdio> 12d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include <cstdlib> 13d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include <cstring> 1474343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org#include <limits> 15d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 16d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include "opentype-sanitiser.h" 17d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 1874343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org// arraysize borrowed from base/basictypes.h 1974343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.orgtemplate <typename T, size_t N> 2074343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.orgchar (&ArraySizeHelper(T (&array)[N]))[N]; 2174343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org#define arraysize(array) (sizeof(ArraySizeHelper(array))) 2274343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org 23d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgnamespace ots { 24d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 25d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#if defined(_MSC_VER) || !defined(OTS_DEBUG) 26d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define OTS_FAILURE() false 27d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#else 28d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define OTS_FAILURE() ots::Failure(__FILE__, __LINE__, __PRETTY_FUNCTION__) 29d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgbool Failure(const char *f, int l, const char *fn); 30d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#endif 31d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 32d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#if defined(_MSC_VER) 33d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// MSVC supports C99 style variadic macros. 34d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define OTS_WARNING(format, ...) 35d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#else 36d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// GCC 37d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#if defined(OTS_DEBUG) 38d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define OTS_WARNING(format, args...) \ 39d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org ots::Warning(__FILE__, __LINE__, format, ##args) 40d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgvoid Warning(const char *f, int l, const char *format, ...) 41d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org __attribute__((format(printf, 3, 4))); 42d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#else 43d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define OTS_WARNING(format, args...) 44d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#endif 45d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#endif 46d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 47d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// Define OTS_NO_TRANSCODE_HINTS (i.e., g++ -DOTS_NO_TRANSCODE_HINTS) if you 48d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// want to omit TrueType hinting instructions and variables in glyf, fpgm, prep, 49d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// and cvt tables. 50d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#if defined(OTS_NO_TRANSCODE_HINTS) 51d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgconst bool g_transcode_hints = false; 52d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#else 53d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgconst bool g_transcode_hints = true; 54d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#endif 55d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 56d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// ----------------------------------------------------------------------------- 57d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// Buffer helper class 58d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// 59d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// This class perform some trival buffer operations while checking for 60d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// out-of-bounds errors. As a family they return false if anything is amiss, 61d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// updating the current offset otherwise. 62d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// ----------------------------------------------------------------------------- 63d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgclass Buffer { 64d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org public: 65d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org Buffer(const uint8_t *buffer, size_t len) 66d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org : buffer_(buffer), 67d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org length_(len), 68d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org offset_(0) { } 69d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 70d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org bool Skip(size_t n_bytes) { 71d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return Read(NULL, n_bytes); 72d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 73d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 74d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org bool Read(uint8_t *buffer, size_t n_bytes) { 75d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if (n_bytes > 1024 * 1024 * 1024) { 76d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return OTS_FAILURE(); 77d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 78d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if ((offset_ + n_bytes > length_) || 79d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org (offset_ > length_ - n_bytes)) { 80d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return OTS_FAILURE(); 81d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 82d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if (buffer) { 83d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org std::memcpy(buffer, buffer_ + offset_, n_bytes); 84d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 85d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org offset_ += n_bytes; 86d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return true; 87d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 88d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 89d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org inline bool ReadU8(uint8_t *value) { 90d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if (offset_ + 1 > length_) { 91d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return OTS_FAILURE(); 92d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 93d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org *value = buffer_[offset_]; 94d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org ++offset_; 95d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return true; 96d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 97d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 98d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org bool ReadU16(uint16_t *value) { 99d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if (offset_ + 2 > length_) { 100d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return OTS_FAILURE(); 101d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 102d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org std::memcpy(value, buffer_ + offset_, sizeof(uint16_t)); 103d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org *value = ntohs(*value); 104d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org offset_ += 2; 105d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return true; 106d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 107d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 108d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org bool ReadS16(int16_t *value) { 109d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return ReadU16(reinterpret_cast<uint16_t*>(value)); 110d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 111d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 11293aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com bool ReadU24(uint32_t *value) { 11393aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com if (offset_ + 3 > length_) { 11493aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com return OTS_FAILURE(); 11593aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com } 11693aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com *value = static_cast<uint32_t>(buffer_[offset_]) << 16 | 11793aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com static_cast<uint32_t>(buffer_[offset_ + 1]) << 8 | 11893aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com static_cast<uint32_t>(buffer_[offset_ + 2]); 11993aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com offset_ += 3; 12093aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com return true; 12193aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com } 12293aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com 123d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org bool ReadU32(uint32_t *value) { 124d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if (offset_ + 4 > length_) { 125d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return OTS_FAILURE(); 126d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 127d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org std::memcpy(value, buffer_ + offset_, sizeof(uint32_t)); 128d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org *value = ntohl(*value); 129d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org offset_ += 4; 130d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return true; 131d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 132d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 133d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org bool ReadS32(int32_t *value) { 134d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return ReadU32(reinterpret_cast<uint32_t*>(value)); 135d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 136d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 137d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org bool ReadTag(uint32_t *value) { 138d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if (offset_ + 4 > length_) { 139d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return OTS_FAILURE(); 140d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 141d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org std::memcpy(value, buffer_ + offset_, sizeof(uint32_t)); 142d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org offset_ += 4; 143d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return true; 144d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 145d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 146d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org bool ReadR64(uint64_t *value) { 147d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if (offset_ + 8 > length_) { 148d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return OTS_FAILURE(); 149d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 150d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org std::memcpy(value, buffer_ + offset_, sizeof(uint64_t)); 151d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org offset_ += 8; 152d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return true; 153d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 154d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 1556263d06109011f6cff761aed14ded117c8fa1836yusukes@chromium.org const uint8_t *buffer() const { return buffer_; } 156d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org size_t offset() const { return offset_; } 157d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org size_t length() const { return length_; } 158d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 159d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org void set_offset(size_t newoffset) { offset_ = newoffset; } 160d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 161d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org private: 162d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org const uint8_t * const buffer_; 163d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org const size_t length_; 164d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org size_t offset_; 165d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org}; 166d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 16774343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org// Round a value up to the nearest multiple of 4. Don't round the value in the 16874343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org// case that rounding up overflows. 16974343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.orgtemplate<typename T> T Round4(T value) { 17074343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org if (std::numeric_limits<T>::max() - value < 3) { 17174343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org return value; 17274343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org } 17374343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org return (value + 3) & ~3; 17474343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org} 17574343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org 176a416dc6e594169d1f809a08efbcf6de831dff291ksakamoto@chromium.orgtemplate<typename T> T Round2(T value) { 177a416dc6e594169d1f809a08efbcf6de831dff291ksakamoto@chromium.org if (value == std::numeric_limits<T>::max()) { 178a416dc6e594169d1f809a08efbcf6de831dff291ksakamoto@chromium.org return value; 179a416dc6e594169d1f809a08efbcf6de831dff291ksakamoto@chromium.org } 180a416dc6e594169d1f809a08efbcf6de831dff291ksakamoto@chromium.org return (value + 1) & ~1; 181a416dc6e594169d1f809a08efbcf6de831dff291ksakamoto@chromium.org} 182a416dc6e594169d1f809a08efbcf6de831dff291ksakamoto@chromium.org 18374343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.orgbool IsValidVersionTag(uint32_t tag); 18474343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org 185d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define FOR_EACH_TABLE_TYPE \ 186d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(cff, CFF) \ 187d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(cmap, CMAP) \ 188d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(cvt, CVT) \ 189d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(fpgm, FPGM) \ 190d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(gasp, GASP) \ 19100b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com F(gdef, GDEF) \ 192d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(glyf, GLYF) \ 193ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org F(gpos, GPOS) \ 194a574866c0e4b1539098e64422f59d01c80cea6cfbashi@chromium.org F(gsub, GSUB) \ 195d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(hdmx, HDMX) \ 196d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(head, HEAD) \ 197d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(hhea, HHEA) \ 198d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(hmtx, HMTX) \ 199f12575f6e5a4b053188d4e205ae6ceb95a60fb2cyusukes@chromium.org F(kern, KERN) \ 200d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(loca, LOCA) \ 201d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(ltsh, LTSH) \ 202d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(maxp, MAXP) \ 203d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(name, NAME) \ 204d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(os2, OS2) \ 205d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(post, POST) \ 206d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(prep, PREP) \ 207d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org F(vdmx, VDMX) \ 2084dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org F(vorg, VORG) \ 2094dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org F(vhea, VHEA) \ 2104dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org F(vmtx, VMTX) 211d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 212d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define F(name, capname) struct OpenType##capname; 213d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgFOR_EACH_TABLE_TYPE 214d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#undef F 215d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 216d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgstruct OpenTypeFile { 217d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org OpenTypeFile() { 218d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define F(name, capname) name = NULL; 219d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org FOR_EACH_TABLE_TYPE 220d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#undef F 221d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 222d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 223d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org uint32_t version; 224d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org uint16_t num_tables; 225d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org uint16_t search_range; 226d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org uint16_t entry_selector; 227d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org uint16_t range_shift; 228d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 229d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define F(name, capname) OpenType##capname *name; 230d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgFOR_EACH_TABLE_TYPE 231d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#undef F 232d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org}; 233d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 2344dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org#define F(name, capname) \ 2354dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.orgbool ots_##name##_parse(OpenTypeFile *f, const uint8_t *d, size_t l); \ 2364dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.orgbool ots_##name##_should_serialise(OpenTypeFile *f); \ 2374dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.orgbool ots_##name##_serialise(OTSStream *s, OpenTypeFile *f); \ 2384dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.orgvoid ots_##name##_free(OpenTypeFile *f); 2394dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org// TODO(yusukes): change these function names to follow Chromium coding rule. 2404dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.orgFOR_EACH_TABLE_TYPE 2414dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org#undef F 2424dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org 243d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org} // namespace ots 244d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 245d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#endif // OTS_H_ 246