blob: bdda8305e2ed8aff96919d7e5cb833873b5d41ec [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/**
Robert Ly11518ac2011-02-09 13:57:06 -080021 * Utility class for packing arguments and structures from Android system objects to
22 * Renderscript objects.
Jason Sams42d6c9e2010-02-02 15:45:58 -080023 *
24 **/
Jason Sams25430d02010-02-02 15:26:40 -080025public class FieldPacker {
26 public FieldPacker(int len) {
27 mPos = 0;
28 mData = new byte[len];
29 }
30
31 public void align(int v) {
32 while ((mPos & (v - 1)) != 0) {
33 mData[mPos++] = 0;
34 }
35 }
36
Jason Samsa70f4162010-03-26 15:33:42 -070037 public void reset() {
Jason Sams25430d02010-02-02 15:26:40 -080038 mPos = 0;
39 }
Jason Samsa70f4162010-03-26 15:33:42 -070040 public void reset(int i) {
41 mPos = i;
42 }
Jason Sams25430d02010-02-02 15:26:40 -080043
Jason Sams020bb7b2010-06-17 15:55:00 -070044 public void skip(int i) {
45 mPos += i;
46 }
47
Jason Samsa70f4162010-03-26 15:33:42 -070048 public void addI8(byte v) {
Jason Sams25430d02010-02-02 15:26:40 -080049 mData[mPos++] = v;
50 }
51
Jason Samsa70f4162010-03-26 15:33:42 -070052 public void addI16(short v) {
Jason Sams25430d02010-02-02 15:26:40 -080053 align(2);
54 mData[mPos++] = (byte)(v & 0xff);
55 mData[mPos++] = (byte)(v >> 8);
56 }
57
Jason Samsa70f4162010-03-26 15:33:42 -070058 public void addI32(int v) {
Jason Sams25430d02010-02-02 15:26:40 -080059 align(4);
60 mData[mPos++] = (byte)(v & 0xff);
61 mData[mPos++] = (byte)((v >> 8) & 0xff);
62 mData[mPos++] = (byte)((v >> 16) & 0xff);
63 mData[mPos++] = (byte)((v >> 24) & 0xff);
64 }
65
Jason Samsa70f4162010-03-26 15:33:42 -070066 public void addI64(long v) {
Jason Sams25430d02010-02-02 15:26:40 -080067 align(8);
68 mData[mPos++] = (byte)(v & 0xff);
69 mData[mPos++] = (byte)((v >> 8) & 0xff);
70 mData[mPos++] = (byte)((v >> 16) & 0xff);
71 mData[mPos++] = (byte)((v >> 24) & 0xff);
72 mData[mPos++] = (byte)((v >> 32) & 0xff);
73 mData[mPos++] = (byte)((v >> 40) & 0xff);
74 mData[mPos++] = (byte)((v >> 48) & 0xff);
75 mData[mPos++] = (byte)((v >> 56) & 0xff);
76 }
77
Jason Samsa70f4162010-03-26 15:33:42 -070078 public void addU8(short v) {
Jason Sams25430d02010-02-02 15:26:40 -080079 if ((v < 0) || (v > 0xff)) {
Jason Samsee734982010-08-12 12:44:02 -070080 android.util.Log.e("rs", "FieldPacker.addU8( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -080081 throw new IllegalArgumentException("Saving value out of range for type");
82 }
83 mData[mPos++] = (byte)v;
84 }
85
Jason Samsa70f4162010-03-26 15:33:42 -070086 public void addU16(int v) {
Jason Sams25430d02010-02-02 15:26:40 -080087 if ((v < 0) || (v > 0xffff)) {
Jason Samsee734982010-08-12 12:44:02 -070088 android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -080089 throw new IllegalArgumentException("Saving value out of range for type");
90 }
91 align(2);
92 mData[mPos++] = (byte)(v & 0xff);
93 mData[mPos++] = (byte)(v >> 8);
94 }
95
Jason Samsa70f4162010-03-26 15:33:42 -070096 public void addU32(long v) {
Jason Samsee734982010-08-12 12:44:02 -070097 if ((v < 0) || (v > 0xffffffffL)) {
98 android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -080099 throw new IllegalArgumentException("Saving value out of range for type");
100 }
101 align(4);
102 mData[mPos++] = (byte)(v & 0xff);
103 mData[mPos++] = (byte)((v >> 8) & 0xff);
104 mData[mPos++] = (byte)((v >> 16) & 0xff);
105 mData[mPos++] = (byte)((v >> 24) & 0xff);
106 }
107
Jason Samsa70f4162010-03-26 15:33:42 -0700108 public void addU64(long v) {
Jason Sams25430d02010-02-02 15:26:40 -0800109 if (v < 0) {
Jason Samsee734982010-08-12 12:44:02 -0700110 android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800111 throw new IllegalArgumentException("Saving value out of range for type");
112 }
113 align(8);
114 mData[mPos++] = (byte)(v & 0xff);
115 mData[mPos++] = (byte)((v >> 8) & 0xff);
116 mData[mPos++] = (byte)((v >> 16) & 0xff);
117 mData[mPos++] = (byte)((v >> 24) & 0xff);
118 mData[mPos++] = (byte)((v >> 32) & 0xff);
119 mData[mPos++] = (byte)((v >> 40) & 0xff);
120 mData[mPos++] = (byte)((v >> 48) & 0xff);
121 mData[mPos++] = (byte)((v >> 56) & 0xff);
122 }
123
Jason Samsa70f4162010-03-26 15:33:42 -0700124 public void addF32(float v) {
Jason Sams25430d02010-02-02 15:26:40 -0800125 addI32(Float.floatToRawIntBits(v));
126 }
127
Stephen Hines02f417052010-09-30 15:19:22 -0700128 public void addF64(double v) {
Jason Sams25430d02010-02-02 15:26:40 -0800129 addI64(Double.doubleToRawLongBits(v));
130 }
131
Jason Samsa70f4162010-03-26 15:33:42 -0700132 public void addObj(BaseObj obj) {
133 if (obj != null) {
134 addI32(obj.getID());
135 } else {
136 addI32(0);
137 }
138 }
139
140 public void addF32(Float2 v) {
141 addF32(v.x);
142 addF32(v.y);
143 }
144 public void addF32(Float3 v) {
145 addF32(v.x);
146 addF32(v.y);
147 addF32(v.z);
148 }
149 public void addF32(Float4 v) {
150 addF32(v.x);
151 addF32(v.y);
152 addF32(v.z);
153 addF32(v.w);
154 }
155
156 public void addI8(Byte2 v) {
157 addI8(v.x);
158 addI8(v.y);
159 }
160 public void addI8(Byte3 v) {
161 addI8(v.x);
162 addI8(v.y);
163 addI8(v.z);
164 }
165 public void addI8(Byte4 v) {
166 addI8(v.x);
167 addI8(v.y);
168 addI8(v.z);
169 addI8(v.w);
170 }
171
172 public void addU8(Short2 v) {
173 addU8(v.x);
174 addU8(v.y);
175 }
176 public void addU8(Short3 v) {
177 addU8(v.x);
178 addU8(v.y);
179 addU8(v.z);
180 }
181 public void addU8(Short4 v) {
182 addU8(v.x);
183 addU8(v.y);
184 addU8(v.z);
185 addU8(v.w);
186 }
187
188 public void addI16(Short2 v) {
189 addI16(v.x);
190 addI16(v.y);
191 }
192 public void addI16(Short3 v) {
193 addI16(v.x);
194 addI16(v.y);
195 addI16(v.z);
196 }
197 public void addI16(Short4 v) {
198 addI16(v.x);
199 addI16(v.y);
200 addI16(v.z);
201 addI16(v.w);
202 }
203
204 public void addU16(Int2 v) {
205 addU16(v.x);
206 addU16(v.y);
207 }
208 public void addU16(Int3 v) {
209 addU16(v.x);
210 addU16(v.y);
211 addU16(v.z);
212 }
213 public void addU16(Int4 v) {
214 addU16(v.x);
215 addU16(v.y);
216 addU16(v.z);
217 addU16(v.w);
218 }
219
220 public void addI32(Int2 v) {
221 addI32(v.x);
222 addI32(v.y);
223 }
224 public void addI32(Int3 v) {
225 addI32(v.x);
226 addI32(v.y);
227 addI32(v.z);
228 }
229 public void addI32(Int4 v) {
230 addI32(v.x);
231 addI32(v.y);
232 addI32(v.z);
233 addI32(v.w);
234 }
235
Stephen Hinese9f5c182011-01-20 18:17:25 -0800236 public void addU32(Long2 v) {
Jason Samsa70f4162010-03-26 15:33:42 -0700237 addU32(v.x);
238 addU32(v.y);
239 }
Stephen Hinese9f5c182011-01-20 18:17:25 -0800240 public void addU32(Long3 v) {
Jason Samsa70f4162010-03-26 15:33:42 -0700241 addU32(v.x);
242 addU32(v.y);
243 addU32(v.z);
244 }
Stephen Hinese9f5c182011-01-20 18:17:25 -0800245 public void addU32(Long4 v) {
Jason Samsa70f4162010-03-26 15:33:42 -0700246 addU32(v.x);
247 addU32(v.y);
248 addU32(v.z);
249 addU32(v.w);
250 }
251
Alex Sakhartchouke27cdee2010-12-17 11:41:08 -0800252 public void addMatrix(Matrix4f v) {
253 for (int i=0; i < v.mMat.length; i++) {
254 addF32(v.mMat[i]);
255 }
256 }
257
258 public void addMatrix(Matrix3f v) {
259 for (int i=0; i < v.mMat.length; i++) {
260 addF32(v.mMat[i]);
261 }
262 }
263
264 public void addMatrix(Matrix2f v) {
265 for (int i=0; i < v.mMat.length; i++) {
266 addF32(v.mMat[i]);
267 }
268 }
269
Jason Samsfae3f6b2010-06-24 13:54:11 -0700270 public void addBoolean(boolean v) {
Jason Sams9e2b0c52010-06-21 18:30:02 -0700271 addI8((byte)(v ? 1 : 0));
Jason Samsf110d4b2010-06-21 17:42:41 -0700272 }
273
Jason Samsa70f4162010-03-26 15:33:42 -0700274 public final byte[] getData() {
Jason Sams25430d02010-02-02 15:26:40 -0800275 return mData;
276 }
277
278 private final byte mData[];
279 private int mPos;
280
281}
282
283