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.os.SystemProperties;
20import android.support.v8.renderscript.RenderScript;
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    private android.renderscript.FieldPacker mN;
33
34    public FieldPacker(int len) {
35        mPos = 0;
36        mLen = len;
37        mData = new byte[len];
38        if (RenderScript.shouldThunk()) {
39            mN = new android.renderscript.FieldPacker(len);
40        }
41    }
42
43    public void align(int v) {
44        if (RenderScript.shouldThunk()) {
45            mN.align(v);
46            return;
47        }
48        if ((v <= 0) || ((v & (v - 1)) != 0)) {
49            throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
50        }
51
52        while ((mPos & (v - 1)) != 0) {
53            mData[mPos++] = 0;
54        }
55    }
56
57    public void reset() {
58        if (RenderScript.shouldThunk()) {
59            mN.reset();
60            return;
61        }
62        mPos = 0;
63    }
64    public void reset(int i) {
65        if (RenderScript.shouldThunk()) {
66            mN.reset(i);
67            return;
68        }
69        if ((i < 0) || (i >= mLen)) {
70            throw new RSIllegalArgumentException("out of range argument: " + i);
71        }
72        mPos = i;
73    }
74
75    public void skip(int i) {
76        if (RenderScript.shouldThunk()) {
77            mN.skip(i);
78            return;
79        }
80        int res = mPos + i;
81        if ((res < 0) || (res > mLen)) {
82            throw new RSIllegalArgumentException("out of range argument: " + i);
83        }
84        mPos = res;
85    }
86
87    public void addI8(byte v) {
88        if (RenderScript.shouldThunk()) {
89            mN.addI8(v);
90            return;
91        }
92        mData[mPos++] = v;
93    }
94
95    public void addI16(short v) {
96        if (RenderScript.shouldThunk()) {
97            mN.addI16(v);
98            return;
99        }
100        align(2);
101        mData[mPos++] = (byte)(v & 0xff);
102        mData[mPos++] = (byte)(v >> 8);
103    }
104
105    public void addI32(int v) {
106        if (RenderScript.shouldThunk()) {
107            mN.addI32(v);
108            return;
109        }
110        align(4);
111        mData[mPos++] = (byte)(v & 0xff);
112        mData[mPos++] = (byte)((v >> 8) & 0xff);
113        mData[mPos++] = (byte)((v >> 16) & 0xff);
114        mData[mPos++] = (byte)((v >> 24) & 0xff);
115    }
116
117    public void addI64(long v) {
118        if (RenderScript.shouldThunk()) {
119            mN.addI64(v);
120            return;
121        }
122        align(8);
123        mData[mPos++] = (byte)(v & 0xff);
124        mData[mPos++] = (byte)((v >> 8) & 0xff);
125        mData[mPos++] = (byte)((v >> 16) & 0xff);
126        mData[mPos++] = (byte)((v >> 24) & 0xff);
127        mData[mPos++] = (byte)((v >> 32) & 0xff);
128        mData[mPos++] = (byte)((v >> 40) & 0xff);
129        mData[mPos++] = (byte)((v >> 48) & 0xff);
130        mData[mPos++] = (byte)((v >> 56) & 0xff);
131    }
132
133    public void addU8(short v) {
134        if (RenderScript.shouldThunk()) {
135            mN.addU8(v);
136            return;
137        }
138        if ((v < 0) || (v > 0xff)) {
139            throw new IllegalArgumentException("Saving value out of range for type");
140        }
141        mData[mPos++] = (byte)v;
142    }
143
144    public void addU16(int v) {
145        if (RenderScript.shouldThunk()) {
146            mN.addU16(v);
147            return;
148        }
149        if ((v < 0) || (v > 0xffff)) {
150            android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
151            throw new IllegalArgumentException("Saving value out of range for type");
152        }
153        align(2);
154        mData[mPos++] = (byte)(v & 0xff);
155        mData[mPos++] = (byte)(v >> 8);
156    }
157
158    public void addU32(long v) {
159        if (RenderScript.shouldThunk()) {
160            mN.addU32(v);
161            return;
162        }
163        if ((v < 0) || (v > 0xffffffffL)) {
164            android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
165            throw new IllegalArgumentException("Saving value out of range for type");
166        }
167        align(4);
168        mData[mPos++] = (byte)(v & 0xff);
169        mData[mPos++] = (byte)((v >> 8) & 0xff);
170        mData[mPos++] = (byte)((v >> 16) & 0xff);
171        mData[mPos++] = (byte)((v >> 24) & 0xff);
172    }
173
174    public void addU64(long v) {
175        if (RenderScript.shouldThunk()) {
176            mN.addU64(v);
177            return;
178        }
179        if (v < 0) {
180            android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
181            throw new IllegalArgumentException("Saving value out of range for type");
182        }
183        align(8);
184        mData[mPos++] = (byte)(v & 0xff);
185        mData[mPos++] = (byte)((v >> 8) & 0xff);
186        mData[mPos++] = (byte)((v >> 16) & 0xff);
187        mData[mPos++] = (byte)((v >> 24) & 0xff);
188        mData[mPos++] = (byte)((v >> 32) & 0xff);
189        mData[mPos++] = (byte)((v >> 40) & 0xff);
190        mData[mPos++] = (byte)((v >> 48) & 0xff);
191        mData[mPos++] = (byte)((v >> 56) & 0xff);
192    }
193
194    public void addF32(float v) {
195        if (RenderScript.shouldThunk()) {
196            mN.addF32(v);
197            return;
198        }
199        addI32(Float.floatToRawIntBits(v));
200    }
201
202    public void addF64(double v) {
203        if (RenderScript.shouldThunk()) {
204            mN.addF64(v);
205            return;
206        }
207        addI64(Double.doubleToRawLongBits(v));
208    }
209
210    public void addObj(BaseObj obj) {
211        if (RenderScript.shouldThunk()) {
212            if (obj != null) {
213                mN.addObj(obj.getNObj());
214            } else {
215                mN.addObj(null);
216            }
217            return;
218        }
219        if (obj != null) {
220            addI32(obj.getID(null));
221        } else {
222            addI32(0);
223        }
224    }
225
226    public void addF32(Float2 v) {
227        if (RenderScript.shouldThunk()) {
228            mN.addF32(new android.renderscript.Float2(v.x, v.y));
229            return;
230        }
231        addF32(v.x);
232        addF32(v.y);
233    }
234    public void addF32(Float3 v) {
235        if (RenderScript.shouldThunk()) {
236            mN.addF32(new android.renderscript.Float3(v.x, v.y, v.z));
237            return;
238        }
239        addF32(v.x);
240        addF32(v.y);
241        addF32(v.z);
242    }
243    public void addF32(Float4 v) {
244        if (RenderScript.shouldThunk()) {
245            mN.addF32(new android.renderscript.Float4(v.x, v.y, v.z, v.w));
246            return;
247        }
248        addF32(v.x);
249        addF32(v.y);
250        addF32(v.z);
251        addF32(v.w);
252    }
253
254    public void addF64(Double2 v) {
255        if (RenderScript.shouldThunk()) {
256            mN.addF64(new android.renderscript.Double2(v.x, v.y));
257            return;
258        }
259        addF64(v.x);
260        addF64(v.y);
261    }
262    public void addF64(Double3 v) {
263        if (RenderScript.shouldThunk()) {
264            mN.addF64(new android.renderscript.Double3(v.x, v.y, v.z));
265            return;
266        }
267        addF64(v.x);
268        addF64(v.y);
269        addF64(v.z);
270    }
271    public void addF64(Double4 v) {
272        if (RenderScript.shouldThunk()) {
273            mN.addF64(new android.renderscript.Double4(v.x, v.y, v.z, v.w));
274            return;
275        }
276        addF64(v.x);
277        addF64(v.y);
278        addF64(v.z);
279        addF64(v.w);
280    }
281
282    public void addI8(Byte2 v) {
283        if (RenderScript.shouldThunk()) {
284            mN.addI8(new android.renderscript.Byte2(v.x, v.y));
285            return;
286        }
287        addI8(v.x);
288        addI8(v.y);
289    }
290    public void addI8(Byte3 v) {
291        if (RenderScript.shouldThunk()) {
292            mN.addI8(new android.renderscript.Byte3(v.x, v.y, v.z));
293            return;
294        }
295        addI8(v.x);
296        addI8(v.y);
297        addI8(v.z);
298    }
299    public void addI8(Byte4 v) {
300        if (RenderScript.shouldThunk()) {
301            mN.addI8(new android.renderscript.Byte4(v.x, v.y, v.z, v.w));
302            return;
303        }
304        addI8(v.x);
305        addI8(v.y);
306        addI8(v.z);
307        addI8(v.w);
308    }
309
310    public void addU8(Short2 v) {
311        if (RenderScript.shouldThunk()) {
312            mN.addU8(new android.renderscript.Short2(v.x, v.y));
313            return;
314        }
315        addU8(v.x);
316        addU8(v.y);
317    }
318    public void addU8(Short3 v) {
319        if (RenderScript.shouldThunk()) {
320            mN.addU8(new android.renderscript.Short3(v.x, v.y, v.z));
321            return;
322        }
323        addU8(v.x);
324        addU8(v.y);
325        addU8(v.z);
326    }
327    public void addU8(Short4 v) {
328        if (RenderScript.shouldThunk()) {
329            mN.addU8(new android.renderscript.Short4(v.x, v.y, v.z, v.w));
330            return;
331        }
332        addU8(v.x);
333        addU8(v.y);
334        addU8(v.z);
335        addU8(v.w);
336    }
337
338    public void addI16(Short2 v) {
339        if (RenderScript.shouldThunk()) {
340            mN.addI16(new android.renderscript.Short2(v.x, v.y));
341            return;
342        }
343        addI16(v.x);
344        addI16(v.y);
345    }
346    public void addI16(Short3 v) {
347        if (RenderScript.shouldThunk()) {
348            mN.addI16(new android.renderscript.Short3(v.x, v.y, v.z));
349            return;
350        }
351        addI16(v.x);
352        addI16(v.y);
353        addI16(v.z);
354    }
355    public void addI16(Short4 v) {
356        if (RenderScript.shouldThunk()) {
357            mN.addI16(new android.renderscript.Short4(v.x, v.y, v.z, v.w));
358            return;
359        }
360        addI16(v.x);
361        addI16(v.y);
362        addI16(v.z);
363        addI16(v.w);
364    }
365
366    public void addU16(Int2 v) {
367        if (RenderScript.shouldThunk()) {
368            mN.addU16(new android.renderscript.Int2(v.x, v.y));
369            return;
370        }
371        addU16(v.x);
372        addU16(v.y);
373    }
374    public void addU16(Int3 v) {
375        if (RenderScript.shouldThunk()) {
376            mN.addU16(new android.renderscript.Int3(v.x, v.y, v.z));
377            return;
378        }
379        addU16(v.x);
380        addU16(v.y);
381        addU16(v.z);
382    }
383    public void addU16(Int4 v) {
384        if (RenderScript.shouldThunk()) {
385            mN.addU16(new android.renderscript.Int4(v.x, v.y, v.z, v.w));
386            return;
387        }
388        addU16(v.x);
389        addU16(v.y);
390        addU16(v.z);
391        addU16(v.w);
392    }
393
394    public void addI32(Int2 v) {
395        if (RenderScript.shouldThunk()) {
396            mN.addI32(new android.renderscript.Int2(v.x, v.y));
397            return;
398        }
399        addI32(v.x);
400        addI32(v.y);
401    }
402    public void addI32(Int3 v) {
403        if (RenderScript.shouldThunk()) {
404            mN.addI32(new android.renderscript.Int3(v.x, v.y, v.z));
405            return;
406        }
407        addI32(v.x);
408        addI32(v.y);
409        addI32(v.z);
410    }
411    public void addI32(Int4 v) {
412        if (RenderScript.shouldThunk()) {
413            mN.addI32(new android.renderscript.Int4(v.x, v.y, v.z, v.w));
414            return;
415        }
416        addI32(v.x);
417        addI32(v.y);
418        addI32(v.z);
419        addI32(v.w);
420    }
421
422    public void addU32(Long2 v) {
423        if (RenderScript.shouldThunk()) {
424            mN.addU32(new android.renderscript.Long2(v.x, v.y));
425            return;
426        }
427        addU32(v.x);
428        addU32(v.y);
429    }
430    public void addU32(Long3 v) {
431        if (RenderScript.shouldThunk()) {
432            mN.addU32(new android.renderscript.Long3(v.x, v.y, v.z));
433            return;
434        }
435        addU32(v.x);
436        addU32(v.y);
437        addU32(v.z);
438    }
439    public void addU32(Long4 v) {
440        if (RenderScript.shouldThunk()) {
441            mN.addU32(new android.renderscript.Long4(v.x, v.y, v.z, v.w));
442            return;
443        }
444        addU32(v.x);
445        addU32(v.y);
446        addU32(v.z);
447        addU32(v.w);
448    }
449
450    public void addI64(Long2 v) {
451        if (RenderScript.shouldThunk()) {
452            mN.addI64(new android.renderscript.Long2(v.x, v.y));
453            return;
454        }
455        addI64(v.x);
456        addI64(v.y);
457    }
458    public void addI64(Long3 v) {
459        if (RenderScript.shouldThunk()) {
460            mN.addI64(new android.renderscript.Long3(v.x, v.y, v.z));
461            return;
462        }
463        addI64(v.x);
464        addI64(v.y);
465        addI64(v.z);
466    }
467    public void addI64(Long4 v) {
468        if (RenderScript.shouldThunk()) {
469            mN.addI64(new android.renderscript.Long4(v.x, v.y, v.z, v.w));
470            return;
471        }
472        addI64(v.x);
473        addI64(v.y);
474        addI64(v.z);
475        addI64(v.w);
476    }
477
478    public void addU64(Long2 v) {
479        if (RenderScript.shouldThunk()) {
480            mN.addU64(new android.renderscript.Long2(v.x, v.y));
481            return;
482        }
483        addU64(v.x);
484        addU64(v.y);
485    }
486    public void addU64(Long3 v) {
487        if (RenderScript.shouldThunk()) {
488            mN.addU64(new android.renderscript.Long3(v.x, v.y, v.z));
489            return;
490        }
491        addU64(v.x);
492        addU64(v.y);
493        addU64(v.z);
494    }
495    public void addU64(Long4 v) {
496        if (RenderScript.shouldThunk()) {
497            mN.addU64(new android.renderscript.Long4(v.x, v.y, v.z, v.w));
498            return;
499        }
500        addU64(v.x);
501        addU64(v.y);
502        addU64(v.z);
503        addU64(v.w);
504    }
505
506    public void addMatrix(Matrix4f v) {
507        if (RenderScript.shouldThunk()) {
508            mN.addMatrix(new android.renderscript.Matrix4f(v.getArray()));
509            return;
510        }
511        for (int i=0; i < v.mMat.length; i++) {
512            addF32(v.mMat[i]);
513        }
514    }
515
516    public void addMatrix(Matrix3f v) {
517        if (RenderScript.shouldThunk()) {
518            mN.addMatrix(new android.renderscript.Matrix3f(v.getArray()));
519            return;
520        }
521        for (int i=0; i < v.mMat.length; i++) {
522            addF32(v.mMat[i]);
523        }
524    }
525
526    public void addMatrix(Matrix2f v) {
527        if (RenderScript.shouldThunk()) {
528            mN.addMatrix(new android.renderscript.Matrix2f(v.getArray()));
529            return;
530        }
531        for (int i=0; i < v.mMat.length; i++) {
532            addF32(v.mMat[i]);
533        }
534    }
535
536    public void addBoolean(boolean v) {
537        if (RenderScript.shouldThunk()) {
538            mN.addBoolean(v);
539            return;
540        }
541        addI8((byte)(v ? 1 : 0));
542    }
543
544    public final byte[] getData() {
545        if (RenderScript.shouldThunk()) {
546            return mN.getData();
547        }
548        return mData;
549    }
550
551    private final byte mData[];
552    private int mPos;
553    private int mLen;
554
555}
556
557
558