10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#ifndef ANDROID_RS_STREAM_H
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#define ANDROID_RS_STREAM_H
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <utils/String8.h>
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <stdio.h>
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// ---------------------------------------------------------------------------
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android {
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript {
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass IStream {
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic:
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    IStream(const uint8_t *, bool use64);
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    float loadF() {
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = (mPos + 3) & (~3);
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        float tmp = reinterpret_cast<const float *>(&mData[mPos])[0];
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos += sizeof(float);
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return tmp;
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int32_t loadI32() {
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = (mPos + 3) & (~3);
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        int32_t tmp = reinterpret_cast<const int32_t *>(&mData[mPos])[0];
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos += sizeof(int32_t);
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return tmp;
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint32_t loadU32() {
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = (mPos + 3) & (~3);
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        uint32_t tmp = reinterpret_cast<const uint32_t *>(&mData[mPos])[0];
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos += sizeof(uint32_t);
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return tmp;
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint16_t loadU16() {
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = (mPos + 1) & (~1);
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        uint16_t tmp = reinterpret_cast<const uint16_t *>(&mData[mPos])[0];
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos += sizeof(uint16_t);
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return tmp;
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    inline uint8_t loadU8() {
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        uint8_t tmp = reinterpret_cast<const uint8_t *>(&mData[mPos])[0];
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos += sizeof(uint8_t);
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return tmp;
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void loadByteArray(void *dest, size_t numBytes);
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint64_t loadOffset();
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void loadString(String8 *s);
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint64_t getPos() const {
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mPos;
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void reset(uint64_t pos) {
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = pos;
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void reset() {
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = 0;
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const uint8_t * getPtr() const {
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mData;
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprotected:
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const uint8_t * mData;
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint64_t mPos;
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool mUse64;
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass OStream {
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic:
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    OStream(uint64_t length, bool use64);
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ~OStream();
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void align(uint32_t bytes) {
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = (mPos + (bytes - 1)) & (~(bytes - 1));
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mPos >= mLength) {
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            growSize();
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void addF(float v) {
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        uint32_t uintV = *reinterpret_cast<uint32_t*> (&v);
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        addU32(uintV);
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void addI32(int32_t v) {
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = (mPos + 3) & (~3);
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mPos + sizeof(v) >= mLength) {
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            growSize();
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)(v & 0xff);
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 8) & 0xff);
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 16) & 0xff);
1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 24) & 0xff);
1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void addU32(uint32_t v) {
1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = (mPos + 3) & (~3);
1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mPos + sizeof(v) >= mLength) {
1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            growSize();
1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)(v & 0xff);
1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 8) & 0xff);
1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 16) & 0xff);
1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)((v >> 24) & 0xff);
1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void addU16(uint16_t v) {
1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = (mPos + 1) & (~1);
1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mPos + sizeof(v) >= mLength) {
1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            growSize();
1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)(v & 0xff);
1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mData[mPos++] = (uint8_t)(v >> 8);
1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    inline void addU8(uint8_t v) {
1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (mPos + 1 >= mLength) {
1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            growSize();
1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        reinterpret_cast<uint8_t *>(&mData[mPos])[0] = v;
1310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos ++;
1320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void addByteArray(const void *src, size_t numBytes);
1340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void addOffset(uint64_t v);
1350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void addString(String8 *s);
1360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint64_t getPos() const {
1370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mPos;
1380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void reset(uint64_t pos) {
1400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = pos;
1410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void reset() {
1430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        mPos = 0;
1440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const uint8_t * getPtr() const {
1460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mData;
1470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprotected:
1490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void growSize();
1500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint8_t * mData;
1510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint64_t mLength;
1520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    uint64_t mPos;
1530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool mUse64;
1540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
1550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} // renderscript
1580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} // android
1590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif //ANDROID_RS_STREAM_H
1600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
162