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