1 /* 2 * Copyright 2011 Google Inc. All Rights Reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "sfntly/data/font_input_stream.h" 18 19 #include <algorithm> 20 21 namespace sfntly { 22 23 FontInputStream::FontInputStream(InputStream* is) 24 : stream_(is), position_(0), length_(0), bounded_(false) { 25 } 26 27 FontInputStream::FontInputStream(InputStream* is, size_t length) 28 : stream_(is), position_(0), length_(length), bounded_(true) { 29 } 30 31 FontInputStream::~FontInputStream() { 32 // Do not close here, underlying InputStream will close themselves. 33 } 34 35 int32_t FontInputStream::Available() { 36 if (stream_) { 37 return stream_->Available(); 38 } 39 return 0; 40 } 41 42 void FontInputStream::Close() { 43 if (stream_) { 44 stream_->Close(); 45 } 46 } 47 48 void FontInputStream::Mark(int32_t readlimit) { 49 if (stream_) { 50 stream_->Mark(readlimit); 51 } 52 } 53 54 bool FontInputStream::MarkSupported() { 55 if (stream_) { 56 return stream_->MarkSupported(); 57 } 58 return false; 59 } 60 61 void FontInputStream::Reset() { 62 if (stream_) { 63 stream_->Reset(); 64 } 65 } 66 67 int32_t FontInputStream::Read() { 68 if (!stream_ || (bounded_ && position_ >= length_)) { 69 return -1; 70 } 71 int32_t b = stream_->Read(); 72 if (b >= 0) { 73 position_++; 74 } 75 return b; 76 } 77 78 int32_t FontInputStream::Read(ByteVector* b, int32_t offset, int32_t length) { 79 if (!stream_ || offset < 0 || length < 0 || 80 (bounded_ && position_ >= length_)) { 81 return -1; 82 } 83 int32_t bytes_to_read = 84 bounded_ ? std::min<int32_t>(length, (int32_t)(length_ - position_)) : 85 length; 86 int32_t bytes_read = stream_->Read(b, offset, bytes_to_read); 87 position_ += bytes_read; 88 return bytes_read; 89 } 90 91 int32_t FontInputStream::Read(ByteVector* b) { 92 return Read(b, 0, b->size()); 93 } 94 95 int32_t FontInputStream::ReadChar() { 96 return Read(); 97 } 98 99 int32_t FontInputStream::ReadUShort() { 100 return 0xffff & (Read() << 8 | Read()); 101 } 102 103 int32_t FontInputStream::ReadShort() { 104 return ((Read() << 8 | Read()) << 16) >> 16; 105 } 106 107 int32_t FontInputStream::ReadUInt24() { 108 return 0xffffff & (Read() << 16 | Read() << 8 | Read()); 109 } 110 111 int64_t FontInputStream::ReadULong() { 112 return 0xffffffffL & ReadLong(); 113 } 114 115 int32_t FontInputStream::ReadULongAsInt() { 116 int64_t ulong = ReadULong(); 117 return ((int32_t)ulong) & ~0x80000000; 118 } 119 120 int32_t FontInputStream::ReadLong() { 121 return Read() << 24 | Read() << 16 | Read() << 8 | Read(); 122 } 123 124 int32_t FontInputStream::ReadFixed() { 125 return ReadLong(); 126 } 127 128 int64_t FontInputStream::ReadDateTimeAsLong() { 129 return (int64_t)ReadULong() << 32 | ReadULong(); 130 } 131 132 int64_t FontInputStream::Skip(int64_t n) { 133 if (stream_) { 134 int64_t skipped = stream_->Skip(n); 135 position_ += skipped; 136 return skipped; 137 } 138 return 0; 139 } 140 141 } // namespace sfntly 142