blob: 24f04093510e7c56f23471602feb8352b72b02a6 [file] [log] [blame]
Jason Sams25430d02010-02-02 15:26:40 -08001/*
2 * Copyright (C) 2008 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
17package android.renderscript;
18
19
Jason Sams42d6c9e2010-02-02 15:45:58 -080020/**
21 * @hide
22 *
23 **/
Jason Sams25430d02010-02-02 15:26:40 -080024public class FieldPacker {
25 public FieldPacker(int len) {
26 mPos = 0;
27 mData = new byte[len];
28 }
29
30 public void align(int v) {
31 while ((mPos & (v - 1)) != 0) {
32 mData[mPos++] = 0;
33 }
34 }
35
Jason Samsa70f4162010-03-26 15:33:42 -070036 public void reset() {
Jason Sams25430d02010-02-02 15:26:40 -080037 mPos = 0;
38 }
Jason Samsa70f4162010-03-26 15:33:42 -070039 public void reset(int i) {
40 mPos = i;
41 }
Jason Sams25430d02010-02-02 15:26:40 -080042
Jason Sams020bb7b2010-06-17 15:55:00 -070043 public void skip(int i) {
44 mPos += i;
45 }
46
Jason Samsa70f4162010-03-26 15:33:42 -070047 public void addI8(byte v) {
Jason Sams25430d02010-02-02 15:26:40 -080048 mData[mPos++] = v;
49 }
50
Jason Samsa70f4162010-03-26 15:33:42 -070051 public void addI16(short v) {
Jason Sams25430d02010-02-02 15:26:40 -080052 align(2);
53 mData[mPos++] = (byte)(v & 0xff);
54 mData[mPos++] = (byte)(v >> 8);
55 }
56
Jason Samsa70f4162010-03-26 15:33:42 -070057 public void addI32(int v) {
Jason Sams25430d02010-02-02 15:26:40 -080058 align(4);
59 mData[mPos++] = (byte)(v & 0xff);
60 mData[mPos++] = (byte)((v >> 8) & 0xff);
61 mData[mPos++] = (byte)((v >> 16) & 0xff);
62 mData[mPos++] = (byte)((v >> 24) & 0xff);
63 }
64
Jason Samsa70f4162010-03-26 15:33:42 -070065 public void addI64(long v) {
Jason Sams25430d02010-02-02 15:26:40 -080066 align(8);
67 mData[mPos++] = (byte)(v & 0xff);
68 mData[mPos++] = (byte)((v >> 8) & 0xff);
69 mData[mPos++] = (byte)((v >> 16) & 0xff);
70 mData[mPos++] = (byte)((v >> 24) & 0xff);
71 mData[mPos++] = (byte)((v >> 32) & 0xff);
72 mData[mPos++] = (byte)((v >> 40) & 0xff);
73 mData[mPos++] = (byte)((v >> 48) & 0xff);
74 mData[mPos++] = (byte)((v >> 56) & 0xff);
75 }
76
Jason Samsa70f4162010-03-26 15:33:42 -070077 public void addU8(short v) {
Jason Sams25430d02010-02-02 15:26:40 -080078 if ((v < 0) || (v > 0xff)) {
Jason Samsee734982010-08-12 12:44:02 -070079 android.util.Log.e("rs", "FieldPacker.addU8( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -080080 throw new IllegalArgumentException("Saving value out of range for type");
81 }
82 mData[mPos++] = (byte)v;
83 }
84
Jason Samsa70f4162010-03-26 15:33:42 -070085 public void addU16(int v) {
Jason Sams25430d02010-02-02 15:26:40 -080086 if ((v < 0) || (v > 0xffff)) {
Jason Samsee734982010-08-12 12:44:02 -070087 android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -080088 throw new IllegalArgumentException("Saving value out of range for type");
89 }
90 align(2);
91 mData[mPos++] = (byte)(v & 0xff);
92 mData[mPos++] = (byte)(v >> 8);
93 }
94
Jason Samsa70f4162010-03-26 15:33:42 -070095 public void addU32(long v) {
Jason Samsee734982010-08-12 12:44:02 -070096 if ((v < 0) || (v > 0xffffffffL)) {
97 android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -080098 throw new IllegalArgumentException("Saving value out of range for type");
99 }
100 align(4);
101 mData[mPos++] = (byte)(v & 0xff);
102 mData[mPos++] = (byte)((v >> 8) & 0xff);
103 mData[mPos++] = (byte)((v >> 16) & 0xff);
104 mData[mPos++] = (byte)((v >> 24) & 0xff);
105 }
106
Jason Samsa70f4162010-03-26 15:33:42 -0700107 public void addU64(long v) {
Jason Sams25430d02010-02-02 15:26:40 -0800108 if (v < 0) {
Jason Samsee734982010-08-12 12:44:02 -0700109 android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800110 throw new IllegalArgumentException("Saving value out of range for type");
111 }
112 align(8);
113 mData[mPos++] = (byte)(v & 0xff);
114 mData[mPos++] = (byte)((v >> 8) & 0xff);
115 mData[mPos++] = (byte)((v >> 16) & 0xff);
116 mData[mPos++] = (byte)((v >> 24) & 0xff);
117 mData[mPos++] = (byte)((v >> 32) & 0xff);
118 mData[mPos++] = (byte)((v >> 40) & 0xff);
119 mData[mPos++] = (byte)((v >> 48) & 0xff);
120 mData[mPos++] = (byte)((v >> 56) & 0xff);
121 }
122
Jason Samsa70f4162010-03-26 15:33:42 -0700123 public void addF32(float v) {
Jason Sams25430d02010-02-02 15:26:40 -0800124 addI32(Float.floatToRawIntBits(v));
125 }
126
Jason Samsa70f4162010-03-26 15:33:42 -0700127 public void addF64(float v) {
Jason Sams25430d02010-02-02 15:26:40 -0800128 addI64(Double.doubleToRawLongBits(v));
129 }
130
Jason Samsa70f4162010-03-26 15:33:42 -0700131 public void addObj(BaseObj obj) {
132 if (obj != null) {
133 addI32(obj.getID());
134 } else {
135 addI32(0);
136 }
137 }
138
139 public void addF32(Float2 v) {
140 addF32(v.x);
141 addF32(v.y);
142 }
143 public void addF32(Float3 v) {
144 addF32(v.x);
145 addF32(v.y);
146 addF32(v.z);
147 }
148 public void addF32(Float4 v) {
149 addF32(v.x);
150 addF32(v.y);
151 addF32(v.z);
152 addF32(v.w);
153 }
154
155 public void addI8(Byte2 v) {
156 addI8(v.x);
157 addI8(v.y);
158 }
159 public void addI8(Byte3 v) {
160 addI8(v.x);
161 addI8(v.y);
162 addI8(v.z);
163 }
164 public void addI8(Byte4 v) {
165 addI8(v.x);
166 addI8(v.y);
167 addI8(v.z);
168 addI8(v.w);
169 }
170
171 public void addU8(Short2 v) {
172 addU8(v.x);
173 addU8(v.y);
174 }
175 public void addU8(Short3 v) {
176 addU8(v.x);
177 addU8(v.y);
178 addU8(v.z);
179 }
180 public void addU8(Short4 v) {
181 addU8(v.x);
182 addU8(v.y);
183 addU8(v.z);
184 addU8(v.w);
185 }
186
187 public void addI16(Short2 v) {
188 addI16(v.x);
189 addI16(v.y);
190 }
191 public void addI16(Short3 v) {
192 addI16(v.x);
193 addI16(v.y);
194 addI16(v.z);
195 }
196 public void addI16(Short4 v) {
197 addI16(v.x);
198 addI16(v.y);
199 addI16(v.z);
200 addI16(v.w);
201 }
202
203 public void addU16(Int2 v) {
204 addU16(v.x);
205 addU16(v.y);
206 }
207 public void addU16(Int3 v) {
208 addU16(v.x);
209 addU16(v.y);
210 addU16(v.z);
211 }
212 public void addU16(Int4 v) {
213 addU16(v.x);
214 addU16(v.y);
215 addU16(v.z);
216 addU16(v.w);
217 }
218
219 public void addI32(Int2 v) {
220 addI32(v.x);
221 addI32(v.y);
222 }
223 public void addI32(Int3 v) {
224 addI32(v.x);
225 addI32(v.y);
226 addI32(v.z);
227 }
228 public void addI32(Int4 v) {
229 addI32(v.x);
230 addI32(v.y);
231 addI32(v.z);
232 addI32(v.w);
233 }
234
235 public void addU32(Int2 v) {
236 addU32(v.x);
237 addU32(v.y);
238 }
239 public void addU32(Int3 v) {
240 addU32(v.x);
241 addU32(v.y);
242 addU32(v.z);
243 }
244 public void addU32(Int4 v) {
245 addU32(v.x);
246 addU32(v.y);
247 addU32(v.z);
248 addU32(v.w);
249 }
250
Jason Samsfae3f6b2010-06-24 13:54:11 -0700251 public void addBoolean(boolean v) {
Jason Sams9e2b0c52010-06-21 18:30:02 -0700252 addI8((byte)(v ? 1 : 0));
Jason Samsf110d4b2010-06-21 17:42:41 -0700253 }
254
Jason Samsa70f4162010-03-26 15:33:42 -0700255 public final byte[] getData() {
Jason Sams25430d02010-02-02 15:26:40 -0800256 return mData;
257 }
258
259 private final byte mData[];
260 private int mPos;
261
262}
263
264