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 
17 package androidx.renderscript;
18 
19 import androidx.renderscript.RenderScript;
20 import 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  * @deprecated Renderscript has been deprecated in API level 31. Please refer to the <a
31  * href="https://developer.android.com/guide/topics/renderscript/migration-guide">migration
32  * guide</a> for the proposed alternatives.
33  **/
34 @Deprecated
35 public class FieldPacker {
FieldPacker(int len)36     public FieldPacker(int len) {
37         mPos = 0;
38         mLen = len;
39         mData = new byte[len];
40         mAlignment = new BitSet();
41     }
42 
FieldPacker(byte[] data)43     public FieldPacker(byte[] data) {
44         // Advance mPos to the end of the buffer, since we are copying in the
45         // full data input.
46         mPos = data.length;
47         mLen = data.length;
48         mData = data;
49         mAlignment = new BitSet();
50         // TODO: We should either have an actual FieldPacker copy constructor
51         // or drop support for computing alignment like this. As it stands,
52         // subAlign() can never work correctly for copied FieldPacker objects.
53     }
54 
createFromArray(Object[] args)55     static FieldPacker createFromArray(Object[] args) {
56         FieldPacker fp = new FieldPacker(RenderScript.sPointerSize * 8);
57         for (Object arg : args) {
58             fp.addSafely(arg);
59         }
60         fp.resize(fp.mPos);
61         return fp;
62     }
63 
align(int v)64     public void align(int v) {
65         if ((v <= 0) || ((v & (v - 1)) != 0)) {
66             throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
67         }
68 
69         while ((mPos & (v - 1)) != 0) {
70             mAlignment.flip(mPos);
71             mData[mPos++] = 0;
72         }
73     }
74 
subalign(int v)75     public void subalign(int v) {
76         if ((v & (v - 1)) != 0) {
77             throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
78         }
79 
80         while ((mPos & (v - 1)) != 0) {
81             mPos--;
82         }
83 
84         if (mPos > 0) {
85             while (mAlignment.get(mPos - 1) == true) {
86                 mPos--;
87                 mAlignment.flip(mPos);
88             }
89         }
90 
91     }
92 
reset()93     public void reset() {
94         mPos = 0;
95     }
reset(int i)96     public void reset(int i) {
97         if ((i < 0) || (i > mLen)) {
98             throw new RSIllegalArgumentException("out of range argument: " + i);
99         }
100         mPos = i;
101     }
102 
skip(int i)103     public void skip(int i) {
104         int res = mPos + i;
105         if ((res < 0) || (res > mLen)) {
106             throw new RSIllegalArgumentException("out of range argument: " + i);
107         }
108         mPos = res;
109     }
110 
addI8(byte v)111     public void addI8(byte v) {
112         mData[mPos++] = v;
113     }
114 
subI8()115     public byte subI8() {
116         subalign(1);
117         return mData[--mPos];
118     }
119 
addI16(short v)120     public void addI16(short v) {
121         align(2);
122         mData[mPos++] = (byte)(v & 0xff);
123         mData[mPos++] = (byte)(v >> 8);
124     }
125 
subI16()126     public short subI16() {
127         subalign(2);
128         short v = 0;
129         v = (short)((mData[--mPos] & 0xff) << 8);
130         v = (short)(v | (short)(mData[--mPos] & 0xff));
131         return v;
132     }
133 
134 
addI32(int v)135     public void addI32(int v) {
136         align(4);
137         mData[mPos++] = (byte)(v & 0xff);
138         mData[mPos++] = (byte)((v >> 8) & 0xff);
139         mData[mPos++] = (byte)((v >> 16) & 0xff);
140         mData[mPos++] = (byte)((v >> 24) & 0xff);
141     }
142 
subI32()143     public int subI32() {
144         subalign(4);
145         int v = 0;
146         v = ((mData[--mPos] & 0xff) << 24);
147         v = v | ((mData[--mPos] & 0xff) << 16);
148         v = v | ((mData[--mPos] & 0xff) << 8);
149         v = v | ((mData[--mPos] & 0xff));
150         return v;
151     }
152 
153 
addI64(long v)154     public void addI64(long v) {
155         align(8);
156         mData[mPos++] = (byte)(v & 0xff);
157         mData[mPos++] = (byte)((v >> 8) & 0xff);
158         mData[mPos++] = (byte)((v >> 16) & 0xff);
159         mData[mPos++] = (byte)((v >> 24) & 0xff);
160         mData[mPos++] = (byte)((v >> 32) & 0xff);
161         mData[mPos++] = (byte)((v >> 40) & 0xff);
162         mData[mPos++] = (byte)((v >> 48) & 0xff);
163         mData[mPos++] = (byte)((v >> 56) & 0xff);
164     }
165 
subI64()166     public long subI64() {
167         subalign(8);
168         long v = 0;
169         byte x = 0;
170         x = ((mData[--mPos]));
171         v = (long)(v | (((long)x) & 0xff) << 56l);
172         x = ((mData[--mPos]));
173         v = (long)(v | (((long)x) & 0xff) << 48l);
174         x = ((mData[--mPos]));
175         v = (long)(v | (((long)x) & 0xff) << 40l);
176         x = ((mData[--mPos]));
177         v = (long)(v | (((long)x) & 0xff) << 32l);
178         x = ((mData[--mPos]));
179         v = (long)(v | (((long)x) & 0xff) << 24l);
180         x = ((mData[--mPos]));
181         v = (long)(v | (((long)x) & 0xff) << 16l);
182         x = ((mData[--mPos]));
183         v = (long)(v | (((long)x) & 0xff) << 8l);
184         x = ((mData[--mPos]));
185         v = (long)(v | (((long)x) & 0xff));
186         return v;
187     }
188 
addU8(short v)189     public void addU8(short v) {
190         if ((v < 0) || (v > 0xff)) {
191             android.util.Log.e("rs", "FieldPacker.addU8( " + v + " )");
192             throw new IllegalArgumentException("Saving value out of range for type");
193         }
194         mData[mPos++] = (byte)v;
195     }
196 
addU16(int v)197     public void addU16(int v) {
198         if ((v < 0) || (v > 0xffff)) {
199             android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
200             throw new IllegalArgumentException("Saving value out of range for type");
201         }
202         align(2);
203         mData[mPos++] = (byte)(v & 0xff);
204         mData[mPos++] = (byte)(v >> 8);
205     }
206 
addU32(long v)207     public void addU32(long v) {
208         if ((v < 0) || (v > 0xffffffffL)) {
209             android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
210             throw new IllegalArgumentException("Saving value out of range for type");
211         }
212         align(4);
213         mData[mPos++] = (byte)(v & 0xff);
214         mData[mPos++] = (byte)((v >> 8) & 0xff);
215         mData[mPos++] = (byte)((v >> 16) & 0xff);
216         mData[mPos++] = (byte)((v >> 24) & 0xff);
217     }
218 
addU64(long v)219     public void addU64(long v) {
220         if (v < 0) {
221             android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
222             throw new IllegalArgumentException("Saving value out of range for type");
223         }
224         align(8);
225         mData[mPos++] = (byte)(v & 0xff);
226         mData[mPos++] = (byte)((v >> 8) & 0xff);
227         mData[mPos++] = (byte)((v >> 16) & 0xff);
228         mData[mPos++] = (byte)((v >> 24) & 0xff);
229         mData[mPos++] = (byte)((v >> 32) & 0xff);
230         mData[mPos++] = (byte)((v >> 40) & 0xff);
231         mData[mPos++] = (byte)((v >> 48) & 0xff);
232         mData[mPos++] = (byte)((v >> 56) & 0xff);
233     }
234 
addF32(float v)235     public void addF32(float v) {
236         addI32(Float.floatToRawIntBits(v));
237     }
238 
subF32()239     public float subF32() {
240         return Float.intBitsToFloat(subI32());
241     }
242 
addF64(double v)243     public void addF64(double v) {
244         addI64(Double.doubleToRawLongBits(v));
245     }
246 
subF64()247     public double subF64() {
248         return Double.longBitsToDouble(subI64());
249     }
250 
addObj(BaseObj obj)251     public void addObj(BaseObj obj) {
252         if (obj != null) {
253             if (RenderScript.sPointerSize == 8) {
254                 addI64(obj.getID(null));
255                 addI64(0);
256                 addI64(0);
257                 addI64(0);
258             } else {
259                 addI32((int)obj.getID(null));
260             }
261         } else {
262             if (RenderScript.sPointerSize == 8) {
263                 addI64(0);
264                 addI64(0);
265                 addI64(0);
266                 addI64(0);
267             } else {
268                 addI32(0);
269             }
270         }
271     }
272 
addF32(Float2 v)273     public void addF32(Float2 v) {
274         addF32(v.x);
275         addF32(v.y);
276     }
addF32(Float3 v)277     public void addF32(Float3 v) {
278         addF32(v.x);
279         addF32(v.y);
280         addF32(v.z);
281     }
addF32(Float4 v)282     public void addF32(Float4 v) {
283         addF32(v.x);
284         addF32(v.y);
285         addF32(v.z);
286         addF32(v.w);
287     }
288 
addF64(Double2 v)289     public void addF64(Double2 v) {
290         addF64(v.x);
291         addF64(v.y);
292     }
addF64(Double3 v)293     public void addF64(Double3 v) {
294         addF64(v.x);
295         addF64(v.y);
296         addF64(v.z);
297     }
addF64(Double4 v)298     public void addF64(Double4 v) {
299         addF64(v.x);
300         addF64(v.y);
301         addF64(v.z);
302         addF64(v.w);
303     }
304 
addI8(Byte2 v)305     public void addI8(Byte2 v) {
306         addI8(v.x);
307         addI8(v.y);
308     }
addI8(Byte3 v)309     public void addI8(Byte3 v) {
310         addI8(v.x);
311         addI8(v.y);
312         addI8(v.z);
313     }
addI8(Byte4 v)314     public void addI8(Byte4 v) {
315         addI8(v.x);
316         addI8(v.y);
317         addI8(v.z);
318         addI8(v.w);
319     }
320 
addU8(Short2 v)321     public void addU8(Short2 v) {
322         addU8(v.x);
323         addU8(v.y);
324     }
addU8(Short3 v)325     public void addU8(Short3 v) {
326         addU8(v.x);
327         addU8(v.y);
328         addU8(v.z);
329     }
addU8(Short4 v)330     public void addU8(Short4 v) {
331         addU8(v.x);
332         addU8(v.y);
333         addU8(v.z);
334         addU8(v.w);
335     }
336 
addI16(Short2 v)337     public void addI16(Short2 v) {
338         addI16(v.x);
339         addI16(v.y);
340     }
addI16(Short3 v)341     public void addI16(Short3 v) {
342         addI16(v.x);
343         addI16(v.y);
344         addI16(v.z);
345     }
addI16(Short4 v)346     public void addI16(Short4 v) {
347         addI16(v.x);
348         addI16(v.y);
349         addI16(v.z);
350         addI16(v.w);
351     }
352 
addU16(Int2 v)353     public void addU16(Int2 v) {
354         addU16(v.x);
355         addU16(v.y);
356     }
addU16(Int3 v)357     public void addU16(Int3 v) {
358         addU16(v.x);
359         addU16(v.y);
360         addU16(v.z);
361     }
addU16(Int4 v)362     public void addU16(Int4 v) {
363         addU16(v.x);
364         addU16(v.y);
365         addU16(v.z);
366         addU16(v.w);
367     }
368 
addI32(Int2 v)369     public void addI32(Int2 v) {
370         addI32(v.x);
371         addI32(v.y);
372     }
addI32(Int3 v)373     public void addI32(Int3 v) {
374         addI32(v.x);
375         addI32(v.y);
376         addI32(v.z);
377     }
addI32(Int4 v)378     public void addI32(Int4 v) {
379         addI32(v.x);
380         addI32(v.y);
381         addI32(v.z);
382         addI32(v.w);
383     }
384 
addU32(Long2 v)385     public void addU32(Long2 v) {
386         addU32(v.x);
387         addU32(v.y);
388     }
addU32(Long3 v)389     public void addU32(Long3 v) {
390         addU32(v.x);
391         addU32(v.y);
392         addU32(v.z);
393     }
addU32(Long4 v)394     public void addU32(Long4 v) {
395         addU32(v.x);
396         addU32(v.y);
397         addU32(v.z);
398         addU32(v.w);
399     }
400 
addI64(Long2 v)401     public void addI64(Long2 v) {
402         addI64(v.x);
403         addI64(v.y);
404     }
addI64(Long3 v)405     public void addI64(Long3 v) {
406         addI64(v.x);
407         addI64(v.y);
408         addI64(v.z);
409     }
addI64(Long4 v)410     public void addI64(Long4 v) {
411         addI64(v.x);
412         addI64(v.y);
413         addI64(v.z);
414         addI64(v.w);
415     }
416 
addU64(Long2 v)417     public void addU64(Long2 v) {
418         addU64(v.x);
419         addU64(v.y);
420     }
addU64(Long3 v)421     public void addU64(Long3 v) {
422         addU64(v.x);
423         addU64(v.y);
424         addU64(v.z);
425     }
addU64(Long4 v)426     public void addU64(Long4 v) {
427         addU64(v.x);
428         addU64(v.y);
429         addU64(v.z);
430         addU64(v.w);
431     }
432 
433 
subFloat2()434     public Float2 subFloat2() {
435         Float2 v = new Float2();
436         v.y = subF32();
437         v.x = subF32();
438         return v;
439     }
subFloat3()440     public Float3 subFloat3() {
441         Float3 v = new Float3();
442         v.z = subF32();
443         v.y = subF32();
444         v.x = subF32();
445         return v;
446     }
subFloat4()447     public Float4 subFloat4() {
448         Float4 v = new Float4();
449         v.w = subF32();
450         v.z = subF32();
451         v.y = subF32();
452         v.x = subF32();
453         return v;
454     }
455 
subDouble2()456     public Double2 subDouble2() {
457         Double2 v = new Double2();
458         v.y = subF64();
459         v.x = subF64();
460         return v;
461     }
subDouble3()462     public Double3 subDouble3() {
463         Double3 v = new Double3();
464         v.z = subF64();
465         v.y = subF64();
466         v.x = subF64();
467         return v;
468     }
subDouble4()469     public Double4 subDouble4() {
470         Double4 v = new Double4();
471         v.w = subF64();
472         v.z = subF64();
473         v.y = subF64();
474         v.x = subF64();
475         return v;
476     }
477 
subByte2()478     public Byte2 subByte2() {
479         Byte2 v = new Byte2();
480         v.y = subI8();
481         v.x = subI8();
482         return v;
483     }
subByte3()484     public Byte3 subByte3() {
485         Byte3 v = new Byte3();
486         v.z = subI8();
487         v.y = subI8();
488         v.x = subI8();
489         return v;
490     }
subByte4()491     public Byte4 subByte4() {
492         Byte4 v = new Byte4();
493         v.w = subI8();
494         v.z = subI8();
495         v.y = subI8();
496         v.x = subI8();
497         return v;
498     }
499 
subShort2()500     public Short2 subShort2() {
501         Short2 v = new Short2();
502         v.y = subI16();
503         v.x = subI16();
504         return v;
505     }
subShort3()506     public Short3 subShort3() {
507         Short3 v = new Short3();
508         v.z = subI16();
509         v.y = subI16();
510         v.x = subI16();
511         return v;
512     }
subShort4()513     public Short4 subShort4() {
514         Short4 v = new Short4();
515         v.w = subI16();
516         v.z = subI16();
517         v.y = subI16();
518         v.x = subI16();
519         return v;
520     }
521 
subInt2()522     public Int2 subInt2() {
523         Int2 v = new Int2();
524         v.y = subI32();
525         v.x = subI32();
526         return v;
527     }
subInt3()528     public Int3 subInt3() {
529         Int3 v = new Int3();
530         v.z = subI32();
531         v.y = subI32();
532         v.x = subI32();
533         return v;
534     }
subInt4()535     public Int4 subInt4() {
536         Int4 v = new Int4();
537         v.w = subI32();
538         v.z = subI32();
539         v.y = subI32();
540         v.x = subI32();
541         return v;
542     }
543 
subLong2()544     public Long2 subLong2() {
545         Long2 v = new Long2();
546         v.y = subI64();
547         v.x = subI64();
548         return v;
549     }
subLong3()550     public Long3 subLong3() {
551         Long3 v = new Long3();
552         v.z = subI64();
553         v.y = subI64();
554         v.x = subI64();
555         return v;
556     }
subLong4()557     public Long4 subLong4() {
558         Long4 v = new Long4();
559         v.w = subI64();
560         v.z = subI64();
561         v.y = subI64();
562         v.x = subI64();
563         return v;
564     }
565 
566 
567 
addMatrix(Matrix4f v)568     public void addMatrix(Matrix4f v) {
569         for (int i=0; i < v.mMat.length; i++) {
570             addF32(v.mMat[i]);
571         }
572     }
573 
subMatrix4f()574     public Matrix4f subMatrix4f() {
575         Matrix4f v = new Matrix4f();
576         for (int i = v.mMat.length - 1; i >= 0; i--) {
577             v.mMat[i] = subF32();
578         }
579         return v;
580     }
581 
addMatrix(Matrix3f v)582     public void addMatrix(Matrix3f v) {
583         for (int i=0; i < v.mMat.length; i++) {
584             addF32(v.mMat[i]);
585         }
586     }
587 
subMatrix3f()588     public Matrix3f subMatrix3f() {
589         Matrix3f v = new Matrix3f();
590         for (int i = v.mMat.length - 1; i >= 0; i--) {
591             v.mMat[i] = subF32();
592         }
593         return v;
594     }
595 
addMatrix(Matrix2f v)596     public void addMatrix(Matrix2f v) {
597         for (int i=0; i < v.mMat.length; i++) {
598             addF32(v.mMat[i]);
599         }
600     }
601 
subMatrix2f()602     public Matrix2f subMatrix2f() {
603         Matrix2f v = new Matrix2f();
604         for (int i = v.mMat.length - 1; i >= 0; i--) {
605             v.mMat[i] = subF32();
606         }
607         return v;
608     }
609 
addBoolean(boolean v)610     public void addBoolean(boolean v) {
611         addI8((byte)(v ? 1 : 0));
612     }
613 
subBoolean()614     public boolean subBoolean() {
615         byte v = subI8();
616         if (v == 1) {
617             return true;
618         }
619         return false;
620     }
621 
getData()622     public final byte[] getData() {
623         return mData;
624     }
625 
626     /**
627      * Get the actual length used for the FieldPacker.
628      *
629      * @hide
630      */
getPos()631     public int getPos() {
632         return mPos;
633     }
634 
addToPack(FieldPacker fp, Object obj)635     private static void addToPack(FieldPacker fp, Object obj) {
636         if (obj instanceof Boolean) {
637             fp.addBoolean(((Boolean)obj).booleanValue());
638             return;
639         }
640 
641         if (obj instanceof Byte) {
642             fp.addI8(((Byte)obj).byteValue());
643             return;
644         }
645 
646         if (obj instanceof Short) {
647             fp.addI16(((Short)obj).shortValue());
648             return;
649         }
650 
651         if (obj instanceof Integer) {
652             fp.addI32(((Integer)obj).intValue());
653             return;
654         }
655 
656         if (obj instanceof Long) {
657             fp.addI64(((Long)obj).longValue());
658             return;
659         }
660 
661         if (obj instanceof Float) {
662             fp.addF32(((Float)obj).floatValue());
663             return;
664         }
665 
666         if (obj instanceof Double) {
667             fp.addF64(((Double)obj).doubleValue());
668             return;
669         }
670 
671         if (obj instanceof Byte2) {
672             fp.addI8((Byte2)obj);
673             return;
674         }
675 
676         if (obj instanceof Byte3) {
677             fp.addI8((Byte3)obj);
678             return;
679         }
680 
681         if (obj instanceof Byte4) {
682             fp.addI8((Byte4)obj);
683             return;
684         }
685 
686         if (obj instanceof Short2) {
687             fp.addI16((Short2)obj);
688             return;
689         }
690 
691         if (obj instanceof Short3) {
692             fp.addI16((Short3)obj);
693             return;
694         }
695 
696         if (obj instanceof Short4) {
697             fp.addI16((Short4)obj);
698             return;
699         }
700 
701         if (obj instanceof Int2) {
702             fp.addI32((Int2)obj);
703             return;
704         }
705 
706         if (obj instanceof Int3) {
707             fp.addI32((Int3)obj);
708             return;
709         }
710 
711         if (obj instanceof Int4) {
712             fp.addI32((Int4)obj);
713             return;
714         }
715 
716         if (obj instanceof Long2) {
717             fp.addI64((Long2)obj);
718             return;
719         }
720 
721         if (obj instanceof Long3) {
722             fp.addI64((Long3)obj);
723             return;
724         }
725 
726         if (obj instanceof Long4) {
727             fp.addI64((Long4)obj);
728             return;
729         }
730 
731         if (obj instanceof Float2) {
732             fp.addF32((Float2)obj);
733             return;
734         }
735 
736         if (obj instanceof Float3) {
737             fp.addF32((Float3)obj);
738             return;
739         }
740 
741         if (obj instanceof Float4) {
742             fp.addF32((Float4)obj);
743             return;
744         }
745 
746         if (obj instanceof Double2) {
747             fp.addF64((Double2)obj);
748             return;
749         }
750 
751         if (obj instanceof Double3) {
752             fp.addF64((Double3)obj);
753             return;
754         }
755 
756         if (obj instanceof Double4) {
757             fp.addF64((Double4)obj);
758             return;
759         }
760 
761         if (obj instanceof Matrix2f) {
762             fp.addMatrix((Matrix2f)obj);
763             return;
764         }
765 
766         if (obj instanceof Matrix3f) {
767             fp.addMatrix((Matrix3f)obj);
768             return;
769         }
770 
771         if (obj instanceof Matrix4f) {
772             fp.addMatrix((Matrix4f)obj);
773             return;
774         }
775 
776         if (obj instanceof BaseObj) {
777             fp.addObj((BaseObj)obj);
778             return;
779         }
780     }
781 
getPackedSize(Object obj)782     private static int getPackedSize(Object obj) {
783         if (obj instanceof Boolean) {
784             return 1;
785         }
786 
787         if (obj instanceof Byte) {
788             return 1;
789         }
790 
791         if (obj instanceof Short) {
792             return 2;
793         }
794 
795         if (obj instanceof Integer) {
796             return 4;
797         }
798 
799         if (obj instanceof Long) {
800             return 8;
801         }
802 
803         if (obj instanceof Float) {
804             return 4;
805         }
806 
807         if (obj instanceof Double) {
808             return 8;
809         }
810 
811         if (obj instanceof Byte2) {
812             return 2;
813         }
814 
815         if (obj instanceof Byte3) {
816             return 3;
817         }
818 
819         if (obj instanceof Byte4) {
820             return 4;
821         }
822 
823         if (obj instanceof Short2) {
824             return 4;
825         }
826 
827         if (obj instanceof Short3) {
828             return 6;
829         }
830 
831         if (obj instanceof Short4) {
832             return 8;
833         }
834 
835         if (obj instanceof Int2) {
836             return 8;
837         }
838 
839         if (obj instanceof Int3) {
840             return 12;
841         }
842 
843         if (obj instanceof Int4) {
844             return 16;
845         }
846 
847         if (obj instanceof Long2) {
848             return 16;
849         }
850 
851         if (obj instanceof Long3) {
852             return 24;
853         }
854 
855         if (obj instanceof Long4) {
856             return 32;
857         }
858 
859         if (obj instanceof Float2) {
860             return 8;
861         }
862 
863         if (obj instanceof Float3) {
864             return 12;
865         }
866 
867         if (obj instanceof Float4) {
868             return 16;
869         }
870 
871         if (obj instanceof Double2) {
872             return 16;
873         }
874 
875         if (obj instanceof Double3) {
876             return 24;
877         }
878 
879         if (obj instanceof Double4) {
880             return 32;
881         }
882 
883         if (obj instanceof Matrix2f) {
884             return 16;
885         }
886 
887         if (obj instanceof Matrix3f) {
888             return 36;
889         }
890 
891         if (obj instanceof Matrix4f) {
892             return 64;
893         }
894 
895         if (obj instanceof BaseObj) {
896             if (RenderScript.sPointerSize == 8) {
897                 return 32;
898             } else {
899                 return 4;
900             }
901         }
902 
903         return 0;
904     }
905 
createFieldPack(Object[] args)906     static FieldPacker createFieldPack(Object[] args) {
907         int len = 0;
908         for (Object arg : args) {
909             len += getPackedSize(arg);
910         }
911         FieldPacker fp = new FieldPacker(len);
912         for (Object arg : args) {
913             addToPack(fp, arg);
914         }
915         return fp;
916     }
917 
918 
resize(int newSize)919     private boolean resize(int newSize) {
920         if (newSize == mLen) {
921             return false;
922         }
923 
924         byte[] newData = new byte[newSize];
925         System.arraycopy(mData, 0, newData, 0, mPos);
926         mData = newData;
927         mLen = newSize;
928         return true;
929     }
930 
addSafely(Object obj)931     private void addSafely(Object obj) {
932         boolean retry;
933         final int oldPos = mPos;
934         do {
935             retry = false;
936             try {
937                 addToPack(this, obj);
938             } catch (ArrayIndexOutOfBoundsException e) {
939                 mPos = oldPos;
940                 resize(mLen * 2);
941                 retry = true;
942             }
943         } while (retry);
944     }
945 
946     private byte mData[];
947     private int mPos;
948     private int mLen;
949     private BitSet mAlignment;
950 }
951