FieldPacker.java revision 470b3b5b70ec71042d30004747c625ca76c4007a
1/*
2 * Copyright (C) 2012 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.support.v8.renderscript;
18
19import android.support.v8.renderscript.RenderScript;
20
21/**
22 * Utility class for packing arguments and structures from Android system objects to
23 * RenderScript objects.
24 *
25 * This class is only intended to be used to support the
26 * reflected code generated by the RS tool chain.  It should not
27 * be called directly.
28 *
29 **/
30public class FieldPacker {
31    public FieldPacker(int len) {
32        mPos = 0;
33        mLen = len;
34        mData = new byte[len];
35    }
36
37    public void align(int v) {
38        if ((v <= 0) || ((v & (v - 1)) != 0)) {
39            throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
40        }
41
42        while ((mPos & (v - 1)) != 0) {
43            mData[mPos++] = 0;
44        }
45    }
46
47    public void reset() {
48        mPos = 0;
49    }
50    public void reset(int i) {
51        if ((i < 0) || (i >= mLen)) {
52            throw new RSIllegalArgumentException("out of range argument: " + i);
53        }
54        mPos = i;
55    }
56
57    public void skip(int i) {
58        int res = mPos + i;
59        if ((res < 0) || (res > mLen)) {
60            throw new RSIllegalArgumentException("out of range argument: " + i);
61        }
62        mPos = res;
63    }
64
65    public void addI8(byte v) {
66        mData[mPos++] = v;
67    }
68
69    public void addI16(short v) {
70        align(2);
71        mData[mPos++] = (byte)(v & 0xff);
72        mData[mPos++] = (byte)(v >> 8);
73    }
74
75    public void addI32(int v) {
76        align(4);
77        mData[mPos++] = (byte)(v & 0xff);
78        mData[mPos++] = (byte)((v >> 8) & 0xff);
79        mData[mPos++] = (byte)((v >> 16) & 0xff);
80        mData[mPos++] = (byte)((v >> 24) & 0xff);
81    }
82
83    public void addI64(long v) {
84        align(8);
85        mData[mPos++] = (byte)(v & 0xff);
86        mData[mPos++] = (byte)((v >> 8) & 0xff);
87        mData[mPos++] = (byte)((v >> 16) & 0xff);
88        mData[mPos++] = (byte)((v >> 24) & 0xff);
89        mData[mPos++] = (byte)((v >> 32) & 0xff);
90        mData[mPos++] = (byte)((v >> 40) & 0xff);
91        mData[mPos++] = (byte)((v >> 48) & 0xff);
92        mData[mPos++] = (byte)((v >> 56) & 0xff);
93    }
94
95    public void addU8(short v) {
96        if ((v < 0) || (v > 0xff)) {
97            throw new IllegalArgumentException("Saving value out of range for type");
98        }
99        mData[mPos++] = (byte)v;
100    }
101
102    public void addU16(int v) {
103        if ((v < 0) || (v > 0xffff)) {
104            android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
105            throw new IllegalArgumentException("Saving value out of range for type");
106        }
107        align(2);
108        mData[mPos++] = (byte)(v & 0xff);
109        mData[mPos++] = (byte)(v >> 8);
110    }
111
112    public void addU32(long v) {
113        if ((v < 0) || (v > 0xffffffffL)) {
114            android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
115            throw new IllegalArgumentException("Saving value out of range for type");
116        }
117        align(4);
118        mData[mPos++] = (byte)(v & 0xff);
119        mData[mPos++] = (byte)((v >> 8) & 0xff);
120        mData[mPos++] = (byte)((v >> 16) & 0xff);
121        mData[mPos++] = (byte)((v >> 24) & 0xff);
122    }
123
124    public void addU64(long v) {
125        if (v < 0) {
126            android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
127            throw new IllegalArgumentException("Saving value out of range for type");
128        }
129        align(8);
130        mData[mPos++] = (byte)(v & 0xff);
131        mData[mPos++] = (byte)((v >> 8) & 0xff);
132        mData[mPos++] = (byte)((v >> 16) & 0xff);
133        mData[mPos++] = (byte)((v >> 24) & 0xff);
134        mData[mPos++] = (byte)((v >> 32) & 0xff);
135        mData[mPos++] = (byte)((v >> 40) & 0xff);
136        mData[mPos++] = (byte)((v >> 48) & 0xff);
137        mData[mPos++] = (byte)((v >> 56) & 0xff);
138    }
139
140    public void addF32(float v) {
141        addI32(Float.floatToRawIntBits(v));
142    }
143
144    public void addF64(double v) {
145        addI64(Double.doubleToRawLongBits(v));
146    }
147
148    public void addObj(BaseObj obj) {
149        if (obj != null) {
150            addI32(obj.getID(null));
151        } else {
152            addI32(0);
153        }
154    }
155
156    public void addF32(Float2 v) {
157        addF32(v.x);
158        addF32(v.y);
159    }
160    public void addF32(Float3 v) {
161        addF32(v.x);
162        addF32(v.y);
163        addF32(v.z);
164    }
165    public void addF32(Float4 v) {
166        addF32(v.x);
167        addF32(v.y);
168        addF32(v.z);
169        addF32(v.w);
170    }
171
172    public void addF64(Double2 v) {
173        addF64(v.x);
174        addF64(v.y);
175    }
176    public void addF64(Double3 v) {
177        addF64(v.x);
178        addF64(v.y);
179        addF64(v.z);
180    }
181    public void addF64(Double4 v) {
182        addF64(v.x);
183        addF64(v.y);
184        addF64(v.z);
185        addF64(v.w);
186    }
187
188    public void addI8(Byte2 v) {
189        addI8(v.x);
190        addI8(v.y);
191    }
192    public void addI8(Byte3 v) {
193        addI8(v.x);
194        addI8(v.y);
195        addI8(v.z);
196    }
197    public void addI8(Byte4 v) {
198        addI8(v.x);
199        addI8(v.y);
200        addI8(v.z);
201        addI8(v.w);
202    }
203
204    public void addU8(Short2 v) {
205        addU8(v.x);
206        addU8(v.y);
207    }
208    public void addU8(Short3 v) {
209        addU8(v.x);
210        addU8(v.y);
211        addU8(v.z);
212    }
213    public void addU8(Short4 v) {
214        addU8(v.x);
215        addU8(v.y);
216        addU8(v.z);
217        addU8(v.w);
218    }
219
220    public void addI16(Short2 v) {
221        addI16(v.x);
222        addI16(v.y);
223    }
224    public void addI16(Short3 v) {
225        addI16(v.x);
226        addI16(v.y);
227        addI16(v.z);
228    }
229    public void addI16(Short4 v) {
230        addI16(v.x);
231        addI16(v.y);
232        addI16(v.z);
233        addI16(v.w);
234    }
235
236    public void addU16(Int2 v) {
237        addU16(v.x);
238        addU16(v.y);
239    }
240    public void addU16(Int3 v) {
241        addU16(v.x);
242        addU16(v.y);
243        addU16(v.z);
244    }
245    public void addU16(Int4 v) {
246        addU16(v.x);
247        addU16(v.y);
248        addU16(v.z);
249        addU16(v.w);
250    }
251
252    public void addI32(Int2 v) {
253        addI32(v.x);
254        addI32(v.y);
255    }
256    public void addI32(Int3 v) {
257        addI32(v.x);
258        addI32(v.y);
259        addI32(v.z);
260    }
261    public void addI32(Int4 v) {
262        addI32(v.x);
263        addI32(v.y);
264        addI32(v.z);
265        addI32(v.w);
266    }
267
268    public void addU32(Long2 v) {
269        addU32(v.x);
270        addU32(v.y);
271    }
272    public void addU32(Long3 v) {
273        addU32(v.x);
274        addU32(v.y);
275        addU32(v.z);
276    }
277    public void addU32(Long4 v) {
278        addU32(v.x);
279        addU32(v.y);
280        addU32(v.z);
281        addU32(v.w);
282    }
283
284    public void addI64(Long2 v) {
285        addI64(v.x);
286        addI64(v.y);
287    }
288    public void addI64(Long3 v) {
289        addI64(v.x);
290        addI64(v.y);
291        addI64(v.z);
292    }
293    public void addI64(Long4 v) {
294        addI64(v.x);
295        addI64(v.y);
296        addI64(v.z);
297        addI64(v.w);
298    }
299
300    public void addU64(Long2 v) {
301        addU64(v.x);
302        addU64(v.y);
303    }
304    public void addU64(Long3 v) {
305        addU64(v.x);
306        addU64(v.y);
307        addU64(v.z);
308    }
309    public void addU64(Long4 v) {
310        addU64(v.x);
311        addU64(v.y);
312        addU64(v.z);
313        addU64(v.w);
314    }
315
316    public void addMatrix(Matrix4f v) {
317        for (int i=0; i < v.mMat.length; i++) {
318            addF32(v.mMat[i]);
319        }
320    }
321
322    public void addMatrix(Matrix3f v) {
323        for (int i=0; i < v.mMat.length; i++) {
324            addF32(v.mMat[i]);
325        }
326    }
327
328    public void addMatrix(Matrix2f v) {
329        for (int i=0; i < v.mMat.length; i++) {
330            addF32(v.mMat[i]);
331        }
332    }
333
334    public void addBoolean(boolean v) {
335        addI8((byte)(v ? 1 : 0));
336    }
337
338    public final byte[] getData() {
339        return mData;
340    }
341
342    public int getPos() {
343        return mPos;
344    }
345
346    private final byte mData[];
347    private int mPos;
348    private int mLen;
349
350}
351
352
353