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