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/memory_byte_array.h" 18 19#include <string.h> 20 21namespace sfntly { 22 23MemoryByteArray::MemoryByteArray(int32_t length) 24 : ByteArray(0, length), b_(NULL), allocated_(true) { 25} 26 27MemoryByteArray::MemoryByteArray(byte_t* b, int32_t filled_length) 28 : ByteArray(filled_length, filled_length), b_(b), allocated_(false) { 29 assert(b); 30} 31 32MemoryByteArray::~MemoryByteArray() { 33 Close(); 34} 35 36int32_t MemoryByteArray::CopyTo(OutputStream* os, 37 int32_t offset, 38 int32_t length) { 39 assert(os); 40 os->Write(b_, offset, length); 41 return length; 42} 43 44void MemoryByteArray::Init() { 45 if (allocated_ && b_ == NULL) { 46 b_ = new byte_t[Size()]; 47 memset(b_, 0, Size()); 48 } 49} 50 51void MemoryByteArray::InternalPut(int32_t index, byte_t b) { 52 Init(); 53 b_[index] = b; 54} 55 56int32_t MemoryByteArray::InternalPut(int32_t index, 57 byte_t* b, 58 int32_t offset, 59 int32_t length) { 60 assert(b); 61 Init(); 62 memcpy(b_ + index, b + offset, length); 63 return length; 64} 65 66byte_t MemoryByteArray::InternalGet(int32_t index) { 67 Init(); 68 return b_[index]; 69} 70 71int32_t MemoryByteArray::InternalGet(int32_t index, 72 byte_t* b, 73 int32_t offset, 74 int32_t length) { 75 assert(b); 76 Init(); 77 memcpy(b + offset, b_ + index, length); 78 return length; 79} 80 81void MemoryByteArray::Close() { 82 if (allocated_ && b_) { 83 delete[] b_; 84 } 85 b_ = NULL; 86} 87 88byte_t* MemoryByteArray::Begin() { 89 Init(); 90 return b_; 91} 92 93} // namespace sfntly 94