diff options
Diffstat (limited to 'sfntly/data/font_output_stream.cc')
-rw-r--r-- | sfntly/data/font_output_stream.cc | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/sfntly/data/font_output_stream.cc b/sfntly/data/font_output_stream.cc new file mode 100644 index 0000000..3422a22 --- /dev/null +++ b/sfntly/data/font_output_stream.cc @@ -0,0 +1,130 @@ +/* + * Copyright 2011 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "sfntly/data/font_output_stream.h" + +#include <algorithm> + +namespace sfntly { + +FontOutputStream::FontOutputStream(OutputStream* os) + : stream_(os), + position_(0) { +} + +FontOutputStream::~FontOutputStream() { + // Do not close, underlying stream shall clean up themselves. +} + +void FontOutputStream::Write(byte_t b) { + if (stream_) { + stream_->Write(b); + position_++; + } +} + +void FontOutputStream::Write(ByteVector* b) { + if (b) { + Write(b, 0, b->size()); + position_ += b->size(); + } +} + +void FontOutputStream::Write(ByteVector* b, int32_t off, int32_t len) { + assert(b); + assert(stream_); + if (off < 0 || len < 0 || off + len < 0 || + static_cast<size_t>(off + len) > b->size()) { +#if !defined (SFNTLY_NO_EXCEPTION) + throw IndexOutOfBoundException(); +#else + return; +#endif + } + + stream_->Write(b, off, len); + position_ += len; +} + +void FontOutputStream::Write(byte_t* b, int32_t off, int32_t len) { + assert(b); + assert(stream_); + if (off < 0 || len < 0 || off + len < 0) { +#if !defined (SFNTLY_NO_EXCEPTION) + throw IndexOutOfBoundException(); +#else + return; +#endif + } + + stream_->Write(b, off, len); + position_ += len; +} + +void FontOutputStream::WriteChar(byte_t c) { + Write(c); +} + +void FontOutputStream::WriteUShort(int32_t us) { + Write((byte_t)((us >> 8) & 0xff)); + Write((byte_t)(us & 0xff)); +} + +void FontOutputStream::WriteShort(int32_t s) { + WriteUShort(s); +} + +void FontOutputStream::WriteUInt24(int32_t ui) { + Write((byte_t)(ui >> 16) & 0xff); + Write((byte_t)(ui >> 8) & 0xff); + Write((byte_t)ui & 0xff); +} + +void FontOutputStream::WriteULong(int64_t ul) { + Write((byte_t)((ul >> 24) & 0xff)); + Write((byte_t)((ul >> 16) & 0xff)); + Write((byte_t)((ul >> 8) & 0xff)); + Write((byte_t)(ul & 0xff)); +} + +void FontOutputStream::WriteLong(int64_t l) { + WriteULong(l); +} + +void FontOutputStream::WriteFixed(int32_t f) { + WriteULong(f); +} + +void FontOutputStream::WriteDateTime(int64_t date) { + WriteULong((date >> 32) & 0xffffffff); + WriteULong(date & 0xffffffff); +} + +void FontOutputStream::Flush() { + if (stream_) { + stream_->Flush(); + } +} + +void FontOutputStream::Close() { + if (stream_) { + stream_->Flush(); + stream_->Close(); + position_ = 0; + } +} + +} // namespace sfntly |