1*e1eccf28SAndroid Build Coastguard Worker /* 2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2009 The Android Open Source Project 3*e1eccf28SAndroid Build Coastguard Worker * 4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*e1eccf28SAndroid Build Coastguard Worker * 8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*e1eccf28SAndroid Build Coastguard Worker * 10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License. 15*e1eccf28SAndroid Build Coastguard Worker */ 16*e1eccf28SAndroid Build Coastguard Worker 17*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RS_STREAM_H 18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RS_STREAM_H 19*e1eccf28SAndroid Build Coastguard Worker 20*e1eccf28SAndroid Build Coastguard Worker #include <stdio.h> 21*e1eccf28SAndroid Build Coastguard Worker #include "rsUtils.h" 22*e1eccf28SAndroid Build Coastguard Worker 23*e1eccf28SAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 24*e1eccf28SAndroid Build Coastguard Worker namespace android { 25*e1eccf28SAndroid Build Coastguard Worker namespace renderscript { 26*e1eccf28SAndroid Build Coastguard Worker 27*e1eccf28SAndroid Build Coastguard Worker class IStream { 28*e1eccf28SAndroid Build Coastguard Worker public: 29*e1eccf28SAndroid Build Coastguard Worker IStream(const uint8_t *, bool use64); 30*e1eccf28SAndroid Build Coastguard Worker loadF()31*e1eccf28SAndroid Build Coastguard Worker float loadF() { 32*e1eccf28SAndroid Build Coastguard Worker mPos = (mPos + 3) & (~3); 33*e1eccf28SAndroid Build Coastguard Worker float tmp = reinterpret_cast<const float *>(&mData[mPos])[0]; 34*e1eccf28SAndroid Build Coastguard Worker mPos += sizeof(float); 35*e1eccf28SAndroid Build Coastguard Worker return tmp; 36*e1eccf28SAndroid Build Coastguard Worker } loadI32()37*e1eccf28SAndroid Build Coastguard Worker int32_t loadI32() { 38*e1eccf28SAndroid Build Coastguard Worker mPos = (mPos + 3) & (~3); 39*e1eccf28SAndroid Build Coastguard Worker int32_t tmp = reinterpret_cast<const int32_t *>(&mData[mPos])[0]; 40*e1eccf28SAndroid Build Coastguard Worker mPos += sizeof(int32_t); 41*e1eccf28SAndroid Build Coastguard Worker return tmp; 42*e1eccf28SAndroid Build Coastguard Worker } loadU32()43*e1eccf28SAndroid Build Coastguard Worker uint32_t loadU32() { 44*e1eccf28SAndroid Build Coastguard Worker mPos = (mPos + 3) & (~3); 45*e1eccf28SAndroid Build Coastguard Worker uint32_t tmp = reinterpret_cast<const uint32_t *>(&mData[mPos])[0]; 46*e1eccf28SAndroid Build Coastguard Worker mPos += sizeof(uint32_t); 47*e1eccf28SAndroid Build Coastguard Worker return tmp; 48*e1eccf28SAndroid Build Coastguard Worker } loadU16()49*e1eccf28SAndroid Build Coastguard Worker uint16_t loadU16() { 50*e1eccf28SAndroid Build Coastguard Worker mPos = (mPos + 1) & (~1); 51*e1eccf28SAndroid Build Coastguard Worker uint16_t tmp = reinterpret_cast<const uint16_t *>(&mData[mPos])[0]; 52*e1eccf28SAndroid Build Coastguard Worker mPos += sizeof(uint16_t); 53*e1eccf28SAndroid Build Coastguard Worker return tmp; 54*e1eccf28SAndroid Build Coastguard Worker } loadU8()55*e1eccf28SAndroid Build Coastguard Worker inline uint8_t loadU8() { 56*e1eccf28SAndroid Build Coastguard Worker uint8_t tmp = reinterpret_cast<const uint8_t *>(&mData[mPos])[0]; 57*e1eccf28SAndroid Build Coastguard Worker mPos += sizeof(uint8_t); 58*e1eccf28SAndroid Build Coastguard Worker return tmp; 59*e1eccf28SAndroid Build Coastguard Worker } 60*e1eccf28SAndroid Build Coastguard Worker void loadByteArray(void *dest, size_t numBytes); 61*e1eccf28SAndroid Build Coastguard Worker uint64_t loadOffset(); 62*e1eccf28SAndroid Build Coastguard Worker const char * loadString(); getPos()63*e1eccf28SAndroid Build Coastguard Worker uint64_t getPos() const { 64*e1eccf28SAndroid Build Coastguard Worker return mPos; 65*e1eccf28SAndroid Build Coastguard Worker } reset(uint64_t pos)66*e1eccf28SAndroid Build Coastguard Worker void reset(uint64_t pos) { 67*e1eccf28SAndroid Build Coastguard Worker mPos = pos; 68*e1eccf28SAndroid Build Coastguard Worker } reset()69*e1eccf28SAndroid Build Coastguard Worker void reset() { 70*e1eccf28SAndroid Build Coastguard Worker mPos = 0; 71*e1eccf28SAndroid Build Coastguard Worker } 72*e1eccf28SAndroid Build Coastguard Worker getPtr()73*e1eccf28SAndroid Build Coastguard Worker const uint8_t * getPtr() const { 74*e1eccf28SAndroid Build Coastguard Worker return mData; 75*e1eccf28SAndroid Build Coastguard Worker } 76*e1eccf28SAndroid Build Coastguard Worker protected: 77*e1eccf28SAndroid Build Coastguard Worker const uint8_t * mData; 78*e1eccf28SAndroid Build Coastguard Worker uint64_t mPos; 79*e1eccf28SAndroid Build Coastguard Worker bool mUse64; 80*e1eccf28SAndroid Build Coastguard Worker }; 81*e1eccf28SAndroid Build Coastguard Worker 82*e1eccf28SAndroid Build Coastguard Worker class OStream { 83*e1eccf28SAndroid Build Coastguard Worker public: 84*e1eccf28SAndroid Build Coastguard Worker OStream(uint64_t length, bool use64); 85*e1eccf28SAndroid Build Coastguard Worker ~OStream(); 86*e1eccf28SAndroid Build Coastguard Worker align(uint32_t bytes)87*e1eccf28SAndroid Build Coastguard Worker void align(uint32_t bytes) { 88*e1eccf28SAndroid Build Coastguard Worker mPos = (mPos + (bytes - 1)) & (~(bytes - 1)); 89*e1eccf28SAndroid Build Coastguard Worker if (mPos >= mLength) { 90*e1eccf28SAndroid Build Coastguard Worker growSize(); 91*e1eccf28SAndroid Build Coastguard Worker } 92*e1eccf28SAndroid Build Coastguard Worker } 93*e1eccf28SAndroid Build Coastguard Worker addF(float v)94*e1eccf28SAndroid Build Coastguard Worker void addF(float v) { 95*e1eccf28SAndroid Build Coastguard Worker uint32_t uintV = *reinterpret_cast<uint32_t*> (&v); 96*e1eccf28SAndroid Build Coastguard Worker addU32(uintV); 97*e1eccf28SAndroid Build Coastguard Worker } addI32(int32_t v)98*e1eccf28SAndroid Build Coastguard Worker void addI32(int32_t v) { 99*e1eccf28SAndroid Build Coastguard Worker mPos = (mPos + 3) & (~3); 100*e1eccf28SAndroid Build Coastguard Worker if (mPos + sizeof(v) >= mLength) { 101*e1eccf28SAndroid Build Coastguard Worker growSize(); 102*e1eccf28SAndroid Build Coastguard Worker } 103*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)(v & 0xff); 104*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 8) & 0xff); 105*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 16) & 0xff); 106*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 24) & 0xff); 107*e1eccf28SAndroid Build Coastguard Worker } addU32(uint32_t v)108*e1eccf28SAndroid Build Coastguard Worker void addU32(uint32_t v) { 109*e1eccf28SAndroid Build Coastguard Worker mPos = (mPos + 3) & (~3); 110*e1eccf28SAndroid Build Coastguard Worker if (mPos + sizeof(v) >= mLength) { 111*e1eccf28SAndroid Build Coastguard Worker growSize(); 112*e1eccf28SAndroid Build Coastguard Worker } 113*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)(v & 0xff); 114*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 8) & 0xff); 115*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 16) & 0xff); 116*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)((v >> 24) & 0xff); 117*e1eccf28SAndroid Build Coastguard Worker } addU16(uint16_t v)118*e1eccf28SAndroid Build Coastguard Worker void addU16(uint16_t v) { 119*e1eccf28SAndroid Build Coastguard Worker mPos = (mPos + 1) & (~1); 120*e1eccf28SAndroid Build Coastguard Worker if (mPos + sizeof(v) >= mLength) { 121*e1eccf28SAndroid Build Coastguard Worker growSize(); 122*e1eccf28SAndroid Build Coastguard Worker } 123*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)(v & 0xff); 124*e1eccf28SAndroid Build Coastguard Worker mData[mPos++] = (uint8_t)(v >> 8); 125*e1eccf28SAndroid Build Coastguard Worker } addU8(uint8_t v)126*e1eccf28SAndroid Build Coastguard Worker inline void addU8(uint8_t v) { 127*e1eccf28SAndroid Build Coastguard Worker if (mPos + 1 >= mLength) { 128*e1eccf28SAndroid Build Coastguard Worker growSize(); 129*e1eccf28SAndroid Build Coastguard Worker } 130*e1eccf28SAndroid Build Coastguard Worker reinterpret_cast<uint8_t *>(&mData[mPos])[0] = v; 131*e1eccf28SAndroid Build Coastguard Worker mPos ++; 132*e1eccf28SAndroid Build Coastguard Worker } 133*e1eccf28SAndroid Build Coastguard Worker void addByteArray(const void *src, size_t numBytes); 134*e1eccf28SAndroid Build Coastguard Worker void addOffset(uint64_t v); 135*e1eccf28SAndroid Build Coastguard Worker void addString(const char *name); 136*e1eccf28SAndroid Build Coastguard Worker void addString(const char *name, size_t len); getPos()137*e1eccf28SAndroid Build Coastguard Worker uint64_t getPos() const { 138*e1eccf28SAndroid Build Coastguard Worker return mPos; 139*e1eccf28SAndroid Build Coastguard Worker } reset(uint64_t pos)140*e1eccf28SAndroid Build Coastguard Worker void reset(uint64_t pos) { 141*e1eccf28SAndroid Build Coastguard Worker mPos = pos; 142*e1eccf28SAndroid Build Coastguard Worker } reset()143*e1eccf28SAndroid Build Coastguard Worker void reset() { 144*e1eccf28SAndroid Build Coastguard Worker mPos = 0; 145*e1eccf28SAndroid Build Coastguard Worker } getPtr()146*e1eccf28SAndroid Build Coastguard Worker const uint8_t * getPtr() const { 147*e1eccf28SAndroid Build Coastguard Worker return mData; 148*e1eccf28SAndroid Build Coastguard Worker } 149*e1eccf28SAndroid Build Coastguard Worker protected: 150*e1eccf28SAndroid Build Coastguard Worker void growSize(); 151*e1eccf28SAndroid Build Coastguard Worker uint8_t * mData; 152*e1eccf28SAndroid Build Coastguard Worker uint64_t mLength; 153*e1eccf28SAndroid Build Coastguard Worker uint64_t mPos; 154*e1eccf28SAndroid Build Coastguard Worker bool mUse64; 155*e1eccf28SAndroid Build Coastguard Worker }; 156*e1eccf28SAndroid Build Coastguard Worker 157*e1eccf28SAndroid Build Coastguard Worker 158*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript 159*e1eccf28SAndroid Build Coastguard Worker } // namespace android 160*e1eccf28SAndroid Build Coastguard Worker #endif //ANDROID_RS_STREAM_H 161*e1eccf28SAndroid Build Coastguard Worker 162*e1eccf28SAndroid Build Coastguard Worker 163