1*e1eccf28SAndroid Build Coastguard Worker
2*e1eccf28SAndroid Build Coastguard Worker /*
3*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2009 The Android Open Source Project
4*e1eccf28SAndroid Build Coastguard Worker *
5*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at
8*e1eccf28SAndroid Build Coastguard Worker *
9*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*e1eccf28SAndroid Build Coastguard Worker *
11*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*e1eccf28SAndroid Build Coastguard Worker * limitations under the License.
16*e1eccf28SAndroid Build Coastguard Worker */
17*e1eccf28SAndroid Build Coastguard Worker
18*e1eccf28SAndroid Build Coastguard Worker #include "rsContext.h"
19*e1eccf28SAndroid Build Coastguard Worker #include "rsStream.h"
20*e1eccf28SAndroid Build Coastguard Worker
21*e1eccf28SAndroid Build Coastguard Worker namespace android {
22*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
23*e1eccf28SAndroid Build Coastguard Worker
IStream(const uint8_t * buf,bool use64)24*e1eccf28SAndroid Build Coastguard Worker IStream::IStream(const uint8_t *buf, bool use64) {
25*e1eccf28SAndroid Build Coastguard Worker mData = buf;
26*e1eccf28SAndroid Build Coastguard Worker mPos = 0;
27*e1eccf28SAndroid Build Coastguard Worker mUse64 = use64;
28*e1eccf28SAndroid Build Coastguard Worker }
29*e1eccf28SAndroid Build Coastguard Worker
loadByteArray(void * dest,size_t numBytes)30*e1eccf28SAndroid Build Coastguard Worker void IStream::loadByteArray(void *dest, size_t numBytes) {
31*e1eccf28SAndroid Build Coastguard Worker memcpy(dest, mData + mPos, numBytes);
32*e1eccf28SAndroid Build Coastguard Worker mPos += numBytes;
33*e1eccf28SAndroid Build Coastguard Worker }
34*e1eccf28SAndroid Build Coastguard Worker
loadOffset()35*e1eccf28SAndroid Build Coastguard Worker uint64_t IStream::loadOffset() {
36*e1eccf28SAndroid Build Coastguard Worker uint64_t tmp;
37*e1eccf28SAndroid Build Coastguard Worker if (mUse64) {
38*e1eccf28SAndroid Build Coastguard Worker mPos = (mPos + 7) & (~7);
39*e1eccf28SAndroid Build Coastguard Worker tmp = reinterpret_cast<const uint64_t *>(&mData[mPos])[0];
40*e1eccf28SAndroid Build Coastguard Worker mPos += sizeof(uint64_t);
41*e1eccf28SAndroid Build Coastguard Worker return tmp;
42*e1eccf28SAndroid Build Coastguard Worker }
43*e1eccf28SAndroid Build Coastguard Worker return loadU32();
44*e1eccf28SAndroid Build Coastguard Worker }
45*e1eccf28SAndroid Build Coastguard Worker
loadString()46*e1eccf28SAndroid Build Coastguard Worker const char * IStream::loadString() {
47*e1eccf28SAndroid Build Coastguard Worker uint32_t len = loadU32();
48*e1eccf28SAndroid Build Coastguard Worker const char *s = rsuCopyString((const char *)&mData[mPos], len);
49*e1eccf28SAndroid Build Coastguard Worker mPos += len;
50*e1eccf28SAndroid Build Coastguard Worker return s;
51*e1eccf28SAndroid Build Coastguard Worker }
52*e1eccf28SAndroid Build Coastguard Worker
53*e1eccf28SAndroid Build Coastguard Worker // Output stream implementation
OStream(uint64_t len,bool use64)54*e1eccf28SAndroid Build Coastguard Worker OStream::OStream(uint64_t len, bool use64) {
55*e1eccf28SAndroid Build Coastguard Worker mData = (uint8_t*)malloc(len);
56*e1eccf28SAndroid Build Coastguard Worker mLength = len;
57*e1eccf28SAndroid Build Coastguard Worker mPos = 0;
58*e1eccf28SAndroid Build Coastguard Worker mUse64 = use64;
59*e1eccf28SAndroid Build Coastguard Worker }
60*e1eccf28SAndroid Build Coastguard Worker
~OStream()61*e1eccf28SAndroid Build Coastguard Worker OStream::~OStream() {
62*e1eccf28SAndroid Build Coastguard Worker free(mData);
63*e1eccf28SAndroid Build Coastguard Worker }
64*e1eccf28SAndroid Build Coastguard Worker
addByteArray(const void * src,size_t numBytes)65*e1eccf28SAndroid Build Coastguard Worker void OStream::addByteArray(const void *src, size_t numBytes) {
66*e1eccf28SAndroid Build Coastguard Worker // We need to potentially grow more than once if the number of byes we write is substantial
67*e1eccf28SAndroid Build Coastguard Worker while (mPos + numBytes >= mLength) {
68*e1eccf28SAndroid Build Coastguard Worker growSize();
69*e1eccf28SAndroid Build Coastguard Worker }
70*e1eccf28SAndroid Build Coastguard Worker memcpy(mData + mPos, src, numBytes);
71*e1eccf28SAndroid Build Coastguard Worker mPos += numBytes;
72*e1eccf28SAndroid Build Coastguard Worker }
73*e1eccf28SAndroid Build Coastguard Worker
addOffset(uint64_t v)74*e1eccf28SAndroid Build Coastguard Worker void OStream::addOffset(uint64_t v) {
75*e1eccf28SAndroid Build Coastguard Worker if (mUse64) {
76*e1eccf28SAndroid Build Coastguard Worker mPos = (mPos + 7) & (~7);
77*e1eccf28SAndroid Build Coastguard Worker if (mPos + sizeof(v) >= mLength) {
78*e1eccf28SAndroid Build Coastguard Worker growSize();
79*e1eccf28SAndroid Build Coastguard Worker }
80*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)(v & 0xff);
81*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 8) & 0xff);
82*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 16) & 0xff);
83*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 24) & 0xff);
84*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 32) & 0xff);
85*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 40) & 0xff);
86*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 48) & 0xff);
87*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 56) & 0xff);
88*e1eccf28SAndroid Build Coastguard Worker } else {
89*e1eccf28SAndroid Build Coastguard Worker addU32(v);
90*e1eccf28SAndroid Build Coastguard Worker }
91*e1eccf28SAndroid Build Coastguard Worker }
92*e1eccf28SAndroid Build Coastguard Worker
addString(const char * s,size_t len)93*e1eccf28SAndroid Build Coastguard Worker void OStream::addString(const char *s, size_t len) {
94*e1eccf28SAndroid Build Coastguard Worker addU32(len);
95*e1eccf28SAndroid Build Coastguard Worker if (mPos + len*sizeof(char) >= mLength) {
96*e1eccf28SAndroid Build Coastguard Worker growSize();
97*e1eccf28SAndroid Build Coastguard Worker }
98*e1eccf28SAndroid Build Coastguard Worker char *stringData = reinterpret_cast<char *>(&mData[mPos]);
99*e1eccf28SAndroid Build Coastguard Worker memcpy(stringData, s, len);
100*e1eccf28SAndroid Build Coastguard Worker mPos += len*sizeof(char);
101*e1eccf28SAndroid Build Coastguard Worker }
102*e1eccf28SAndroid Build Coastguard Worker
addString(const char * s)103*e1eccf28SAndroid Build Coastguard Worker void OStream::addString(const char *s) {
104*e1eccf28SAndroid Build Coastguard Worker addString(s, strlen(s));
105*e1eccf28SAndroid Build Coastguard Worker }
106*e1eccf28SAndroid Build Coastguard Worker
growSize()107*e1eccf28SAndroid Build Coastguard Worker void OStream::growSize() {
108*e1eccf28SAndroid Build Coastguard Worker uint8_t *newData = (uint8_t*)malloc(mLength*2);
109*e1eccf28SAndroid Build Coastguard Worker memcpy(newData, mData, mLength*sizeof(uint8_t));
110*e1eccf28SAndroid Build Coastguard Worker mLength = mLength * 2;
111*e1eccf28SAndroid Build Coastguard Worker free(mData);
112*e1eccf28SAndroid Build Coastguard Worker mData = newData;
113*e1eccf28SAndroid Build Coastguard Worker }
114*e1eccf28SAndroid Build Coastguard Worker
115*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
116*e1eccf28SAndroid Build Coastguard Worker } // namespace android
117