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 \
1866462c58fa123bb89baf1ec4b7538d8f2c682dc8bbashi@chromium.org  F(cbdt, CBDT) \
1876462c58fa123bb89baf1ec4b7538d8f2c682dc8bbashi@chromium.org  F(cblc, CBLC) \
188d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(cff, CFF) \
189d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(cmap, CMAP) \
190d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(cvt, CVT) \
191d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(fpgm, FPGM) \
192d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(gasp, GASP) \
19300b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com  F(gdef, GDEF) \
194d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(glyf, GLYF) \
195ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org  F(gpos, GPOS) \
196a574866c0e4b1539098e64422f59d01c80cea6cfbashi@chromium.org  F(gsub, GSUB) \
197d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(hdmx, HDMX) \
198d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(head, HEAD) \
199d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(hhea, HHEA) \
200d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(hmtx, HMTX) \
201f12575f6e5a4b053188d4e205ae6ceb95a60fb2cyusukes@chromium.org  F(kern, KERN) \
202d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(loca, LOCA) \
203d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(ltsh, LTSH) \
204eea48361b1ffcc1bded0ba25c8f747e634cd8e51ksakamoto@chromium.org  F(math, MATH) \
205d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(maxp, MAXP) \
206d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(name, NAME) \
207d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(os2, OS2) \
208d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(post, POST) \
209d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(prep, PREP) \
210d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  F(vdmx, VDMX) \
2114dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org  F(vorg, VORG) \
2124dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org  F(vhea, VHEA) \
2134dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org  F(vmtx, VMTX)
214d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
215d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define F(name, capname) struct OpenType##capname;
216d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgFOR_EACH_TABLE_TYPE
217d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#undef F
218d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
219d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgstruct OpenTypeFile {
220d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  OpenTypeFile() {
221d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define F(name, capname) name = NULL;
222d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org    FOR_EACH_TABLE_TYPE
223d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#undef F
224d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  }
225d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
226d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  uint32_t version;
227d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  uint16_t num_tables;
228d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  uint16_t search_range;
229d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  uint16_t entry_selector;
230d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org  uint16_t range_shift;
231d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
232d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define F(name, capname) OpenType##capname *name;
233d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgFOR_EACH_TABLE_TYPE
234d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#undef F
235d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org};
236d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
2374dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org#define F(name, capname) \
2384dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.orgbool ots_##name##_parse(OpenTypeFile *f, const uint8_t *d, size_t l); \
2394dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.orgbool ots_##name##_should_serialise(OpenTypeFile *f); \
2404dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.orgbool ots_##name##_serialise(OTSStream *s, OpenTypeFile *f); \
2414dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.orgvoid ots_##name##_free(OpenTypeFile *f);
2424dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org// TODO(yusukes): change these function names to follow Chromium coding rule.
2434dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.orgFOR_EACH_TABLE_TYPE
2444dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org#undef F
2454dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org
246d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org}  // namespace ots
247d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
248d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#endif  // OTS_H_
249