1437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// Copyright 2013 Google Inc. All Rights Reserved.
2437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter//
3437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// Licensed under the Apache License, Version 2.0 (the "License");
4437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// you may not use this file except in compliance with the License.
5437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// You may obtain a copy of the License at
6437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter//
7437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// http://www.apache.org/licenses/LICENSE-2.0
8437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter//
9437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// Unless required by applicable law or agreed to in writing, software
10437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// distributed under the License is distributed on an "AS IS" BASIS,
11437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// See the License for the specific language governing permissions and
13437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// limitations under the License.
14437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter//
15437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// The parts of ots.h & opentype-sanitiser.h that we need, taken from the
16437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// https://code.google.com/p/ots/ project.
17437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
18142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi#ifndef WOFF2_BUFFER_H_
19142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi#define WOFF2_BUFFER_H_
20437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
216cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashi#if defined(_WIN32)
226cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashi#include <stdlib.h>
236cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashitypedef signed char int8_t;
246cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashitypedef unsigned char uint8_t;
256cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashitypedef short int16_t;
266cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashitypedef unsigned short uint16_t;
276cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashitypedef int int32_t;
286cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashitypedef unsigned int uint32_t;
296cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashitypedef __int64 int64_t;
306cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashitypedef unsigned __int64 uint64_t;
316cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashi#define ntohl(x) _byteswap_ulong (x)
326cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashi#define ntohs(x) _byteswap_ushort (x)
336cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashi#define htonl(x) _byteswap_ulong (x)
346cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashi#define htons(x) _byteswap_ushort (x)
356cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashi#else
362e5995bd9628953ebd8bfdadbfbc3af0c8296167Roderick Sheeter#include <arpa/inet.h>
376cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashi#include <stdint.h>
386cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashi#endif
396cef49677dc4c650ef6e3f56041e0a41803afa8cKenichi Ishibashi
40437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter#include <cstdlib>
41437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter#include <cstring>
42437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter#include <limits>
43437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
44142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashinamespace woff2 {
45437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
46142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi#if defined(_MSC_VER) || !defined(FONT_COMPRESSION_DEBUG)
47142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi#define FONT_COMPRESSION_FAILURE() false
48437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter#else
49142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi#define FONT_COMPRESSION_FAILURE() \
50142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi  util::compression::font::Failure(__FILE__, __LINE__, __PRETTY_FUNCTION__)
51437bbad37074e472b66d427814275de84ca77f19Roderick Sheeterinline bool Failure(const char *f, int l, const char *fn) {
52437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  std::fprintf(stderr, "ERROR at %s:%d (%s)\n", f, l, fn);
53437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  std::fflush(stderr);
54437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  return false;
55437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter}
56437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter#endif
57437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
58437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// -----------------------------------------------------------------------------
59437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// Buffer helper class
60437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter//
61437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// This class perform some trival buffer operations while checking for
62437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// out-of-bounds errors. As a family they return false if anything is amiss,
63437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// updating the current offset otherwise.
64437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// -----------------------------------------------------------------------------
65437bbad37074e472b66d427814275de84ca77f19Roderick Sheeterclass Buffer {
66437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter public:
67437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  Buffer(const uint8_t *buffer, size_t len)
68437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter      : buffer_(buffer),
69437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter        length_(len),
70437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter        offset_(0) { }
71437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
72437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  bool Skip(size_t n_bytes) {
73437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    return Read(NULL, n_bytes);
74437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  }
75437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
76437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  bool Read(uint8_t *buffer, size_t n_bytes) {
77437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    if (n_bytes > 1024 * 1024 * 1024) {
78142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi      return FONT_COMPRESSION_FAILURE();
79437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    }
80437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    if ((offset_ + n_bytes > length_) ||
81437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter        (offset_ > length_ - n_bytes)) {
82142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi      return FONT_COMPRESSION_FAILURE();
83437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    }
84437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    if (buffer) {
85437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter      std::memcpy(buffer, buffer_ + offset_, n_bytes);
86437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    }
87437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    offset_ += n_bytes;
88437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    return true;
89437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  }
90437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
91437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  inline bool ReadU8(uint8_t *value) {
92437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    if (offset_ + 1 > length_) {
93142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi      return FONT_COMPRESSION_FAILURE();
94437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    }
95437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    *value = buffer_[offset_];
96437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    ++offset_;
97437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    return true;
98437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  }
99437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
100437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  bool ReadU16(uint16_t *value) {
101437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    if (offset_ + 2 > length_) {
102142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi      return FONT_COMPRESSION_FAILURE();
103437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    }
104437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    std::memcpy(value, buffer_ + offset_, sizeof(uint16_t));
105437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    *value = ntohs(*value);
106437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    offset_ += 2;
107437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    return true;
108437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  }
109437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
110437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  bool ReadS16(int16_t *value) {
111437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    return ReadU16(reinterpret_cast<uint16_t*>(value));
112437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  }
113437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
114437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  bool ReadU24(uint32_t *value) {
115437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    if (offset_ + 3 > length_) {
116142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi      return FONT_COMPRESSION_FAILURE();
117437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    }
118437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    *value = static_cast<uint32_t>(buffer_[offset_]) << 16 |
119437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter        static_cast<uint32_t>(buffer_[offset_ + 1]) << 8 |
120437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter        static_cast<uint32_t>(buffer_[offset_ + 2]);
121437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    offset_ += 3;
122437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    return true;
123437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  }
124437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
125437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  bool ReadU32(uint32_t *value) {
126437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    if (offset_ + 4 > length_) {
127142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi      return FONT_COMPRESSION_FAILURE();
128437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    }
129437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    std::memcpy(value, buffer_ + offset_, sizeof(uint32_t));
130437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    *value = ntohl(*value);
131437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    offset_ += 4;
132437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    return true;
133437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  }
134437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
135437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  bool ReadS32(int32_t *value) {
136437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    return ReadU32(reinterpret_cast<uint32_t*>(value));
137437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  }
138437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
139437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  bool ReadTag(uint32_t *value) {
140437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    if (offset_ + 4 > length_) {
141142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi      return FONT_COMPRESSION_FAILURE();
142437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    }
143437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    std::memcpy(value, buffer_ + offset_, sizeof(uint32_t));
144437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    offset_ += 4;
145437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    return true;
146437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  }
147437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
148437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  bool ReadR64(uint64_t *value) {
149437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    if (offset_ + 8 > length_) {
150142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi      return FONT_COMPRESSION_FAILURE();
151437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    }
152437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    std::memcpy(value, buffer_ + offset_, sizeof(uint64_t));
153437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    offset_ += 8;
154437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter    return true;
155437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  }
156437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
157437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  const uint8_t *buffer() const { return buffer_; }
158437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  size_t offset() const { return offset_; }
159437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  size_t length() const { return length_; }
160437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
161437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  void set_offset(size_t newoffset) { offset_ = newoffset; }
162437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
163437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter private:
164437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  const uint8_t * const buffer_;
165437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  const size_t length_;
166437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter  size_t offset_;
167437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter};
168437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
169142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi} // namespace woff2
170437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter
171142d8881c174896c0180d60d3efe66a07daa7256Kenichi Ishibashi#endif  // WOFF2_BUFFER_H_
172