blob: 5ccd6ca50c63f9b8e085221280474d81dbd1cd98 [file] [log] [blame]
Alex Sakhartchoukaa7d2882010-05-21 12:53:13 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
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#ifndef ANDROID_RS_STREAM_H
18#define ANDROID_RS_STREAM_H
19
20#include <utils/String8.h>
21#include <stdio.h>
22
23// ---------------------------------------------------------------------------
24namespace android {
25namespace renderscript {
26
27class IStream
28{
29public:
30 IStream(const uint8_t *, bool use64);
31
32 float loadF() {
33 mPos = (mPos + 3) & (~3);
34 float tmp = reinterpret_cast<const float *>(&mData[mPos])[0];
35 mPos += sizeof(float);
36 return tmp;
37 }
38 int32_t loadI32() {
39 mPos = (mPos + 3) & (~3);
40 int32_t tmp = reinterpret_cast<const int32_t *>(&mData[mPos])[0];
41 mPos += sizeof(int32_t);
42 return tmp;
43 }
44 uint32_t loadU32() {
45 mPos = (mPos + 3) & (~3);
46 uint32_t tmp = reinterpret_cast<const uint32_t *>(&mData[mPos])[0];
47 mPos += sizeof(uint32_t);
48 return tmp;
49 }
50 uint16_t loadU16() {
51 mPos = (mPos + 1) & (~1);
52 uint16_t tmp = reinterpret_cast<const uint16_t *>(&mData[mPos])[0];
53 mPos += sizeof(uint16_t);
54 return tmp;
55 }
56 inline uint8_t loadU8() {
57 uint8_t tmp = reinterpret_cast<const uint8_t *>(&mData[mPos])[0];
58 mPos += sizeof(uint8_t);
59 return tmp;
60 }
61 void loadByteArray(void *dest, size_t numBytes);
62 uint64_t loadOffset();
63 void loadString(String8 *s);
64 uint64_t getPos() const {
65 return mPos;
66 }
67 void reset(uint64_t pos) {
68 mPos = pos;
69 }
70 void reset() {
71 mPos = 0;
72 }
73
74 const uint8_t * getPtr() const {
75 return mData;
76 }
77protected:
78 const uint8_t * mData;
79 uint64_t mPos;
80 bool mUse64;
81};
82
83class OStream
84{
85public:
86 OStream(uint64_t length, bool use64);
87 ~OStream();
88
89 void addF(float v) {
90 uint32_t uintV = *reinterpret_cast<uint32_t*> (&v);
91 addU32(uintV);
92 }
93 void addI32(int32_t v) {
94 mPos = (mPos + 3) & (~3);
95 if(mPos + sizeof(v) >= mLength) {
96 growSize();
97 }
98 mData[mPos++] = (uint8_t)(v & 0xff);
99 mData[mPos++] = (uint8_t)((v >> 8) & 0xff);
100 mData[mPos++] = (uint8_t)((v >> 16) & 0xff);
101 mData[mPos++] = (uint8_t)((v >> 24) & 0xff);
102 }
103 void addU32(uint32_t v) {
104 mPos = (mPos + 3) & (~3);
105 if(mPos + sizeof(v) >= mLength) {
106 growSize();
107 }
108 mData[mPos++] = (uint8_t)(v & 0xff);
109 mData[mPos++] = (uint8_t)((v >> 8) & 0xff);
110 mData[mPos++] = (uint8_t)((v >> 16) & 0xff);
111 mData[mPos++] = (uint8_t)((v >> 24) & 0xff);
112 }
113 void addU16(uint16_t v) {
114 mPos = (mPos + 1) & (~1);
115 if(mPos + sizeof(v) >= mLength) {
116 growSize();
117 }
118 mData[mPos++] = (uint8_t)(v & 0xff);
119 mData[mPos++] = (uint8_t)(v >> 8);
120 }
121 inline void addU8(uint8_t v) {
122 if(mPos + 1 >= mLength) {
123 growSize();
124 }
125 reinterpret_cast<uint8_t *>(&mData[mPos])[0] = v;
126 mPos ++;
127 }
128 void addByteArray(const void *src, size_t numBytes);
129 void addOffset(uint64_t v);
130 void addString(String8 *s);
131 uint64_t getPos() const {
132 return mPos;
133 }
134 void reset(uint64_t pos) {
135 mPos = pos;
136 }
137 void reset() {
138 mPos = 0;
139 }
140 const uint8_t * getPtr() const {
141 return mData;
142 }
143protected:
144 void growSize();
145 uint8_t * mData;
146 uint64_t mLength;
147 uint64_t mPos;
148 bool mUse64;
149};
150
151
152} // renderscript
153} // android
154#endif //ANDROID_RS_STREAM_H
155
156