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