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