145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/*
245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Copyright (C) 2012 The Android Open Source Project
345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * you may not use this file except in compliance with the License.
645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * You may obtain a copy of the License at
745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
1045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Unless required by applicable law or agreed to in writing, software
1145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * See the License for the specific language governing permissions and
1445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * limitations under the License.
1545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */
1645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1745d443665f5ce7efa934706a89883f0cc87f3513Jason Samspackage android.support.v8.renderscript;
1845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
19257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hinesimport android.support.v8.renderscript.RenderScript;
20bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wangimport java.util.BitSet;
2145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/**
2345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Utility class for packing arguments and structures from Android system objects to
24032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * RenderScript objects.
25032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines *
26032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * This class is only intended to be used to support the
27032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * reflected code generated by the RS tool chain.  It should not
28032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * be called directly.
2945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
3045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams **/
3145d443665f5ce7efa934706a89883f0cc87f3513Jason Samspublic class FieldPacker {
3245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public FieldPacker(int len) {
3345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mPos = 0;
3445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mLen = len;
3545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData = new byte[len];
36bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        mAlignment = new BitSet();
3745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
3845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
398352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public FieldPacker(byte[] data) {
408352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        // Advance mPos to the end of the buffer, since we are copying in the
418352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        // full data input.
428352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        mPos = data.length;
438352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        mLen = data.length;
448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        mData = data;
458352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        mAlignment = new BitSet();
468352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        // TODO: We should either have an actual FieldPacker copy constructor
478352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        // or drop support for computing alignment like this. As it stands,
488352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        // subAlign() can never work correctly for copied FieldPacker objects.
498352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
508352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
51f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang    static FieldPacker createFromArray(Object[] args) {
52f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        FieldPacker fp = new FieldPacker(RenderScript.sPointerSize * 8);
53f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        for (Object arg : args) {
54f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang            fp.addSafely(arg);
55f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        }
56f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        fp.resize(fp.mPos);
57f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        return fp;
58f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang    }
59f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang
6045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void align(int v) {
6145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if ((v <= 0) || ((v & (v - 1)) != 0)) {
6245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
6345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
6445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
6545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        while ((mPos & (v - 1)) != 0) {
66bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            mAlignment.flip(mPos);
6745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mData[mPos++] = 0;
6845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
6945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
7045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
718352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public void subalign(int v) {
728352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if ((v & (v - 1)) != 0) {
738352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
748352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
758352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
768352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        while ((mPos & (v - 1)) != 0) {
778352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            mPos--;
788352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
798352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
808352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (mPos > 0) {
818352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            while (mAlignment.get(mPos - 1) == true) {
828352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang                mPos--;
838352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang                mAlignment.flip(mPos);
848352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            }
858352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
868352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
878352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
888352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void reset() {
9045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mPos = 0;
9145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
9245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void reset(int i) {
938352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if ((i < 0) || (i > mLen)) {
9445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("out of range argument: " + i);
9545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
9645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mPos = i;
9745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
9845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
9945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void skip(int i) {
10045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int res = mPos + i;
10145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if ((res < 0) || (res > mLen)) {
10245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException("out of range argument: " + i);
10345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
10445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mPos = res;
10545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
10645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
10745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI8(byte v) {
10845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = v;
10945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
11045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1118352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public byte subI8() {
1128352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        subalign(1);
1138352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return mData[--mPos];
1148352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
1158352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
11645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI16(short v) {
11745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        align(2);
11845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)(v & 0xff);
11945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)(v >> 8);
12045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
12145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1228352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public short subI16() {
1238352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        subalign(2);
1248352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        short v = 0;
1258352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = (short)((mData[--mPos] & 0xff) << 8);
1268352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = (short)(v | (short)(mData[--mPos] & 0xff));
1278352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
1288352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
1298352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
1308352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
13145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI32(int v) {
13245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        align(4);
13345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)(v & 0xff);
13445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 8) & 0xff);
13545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 16) & 0xff);
13645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 24) & 0xff);
13745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
13845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1398352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public int subI32() {
1408352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        subalign(4);
1418352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        int v = 0;
1428352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = ((mData[--mPos] & 0xff) << 24);
1438352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = v | ((mData[--mPos] & 0xff) << 16);
1448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = v | ((mData[--mPos] & 0xff) << 8);
1458352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = v | ((mData[--mPos] & 0xff));
1468352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
1478352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
1488352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
1498352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
15045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI64(long v) {
15145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        align(8);
15245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)(v & 0xff);
15345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 8) & 0xff);
15445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 16) & 0xff);
15545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 24) & 0xff);
15645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 32) & 0xff);
15745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 40) & 0xff);
15845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 48) & 0xff);
15945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 56) & 0xff);
16045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
16145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1628352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public long subI64() {
1638352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        subalign(8);
1648352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        long v = 0;
1658352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        byte x = 0;
1668352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        x = ((mData[--mPos]));
1678352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = (long)(v | (((long)x) & 0xff) << 56l);
1688352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        x = ((mData[--mPos]));
1698352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = (long)(v | (((long)x) & 0xff) << 48l);
1708352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        x = ((mData[--mPos]));
1718352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = (long)(v | (((long)x) & 0xff) << 40l);
1728352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        x = ((mData[--mPos]));
1738352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = (long)(v | (((long)x) & 0xff) << 32l);
1748352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        x = ((mData[--mPos]));
1758352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = (long)(v | (((long)x) & 0xff) << 24l);
1768352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        x = ((mData[--mPos]));
1778352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = (long)(v | (((long)x) & 0xff) << 16l);
1788352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        x = ((mData[--mPos]));
1798352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = (long)(v | (((long)x) & 0xff) << 8l);
1808352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        x = ((mData[--mPos]));
1818352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v = (long)(v | (((long)x) & 0xff));
1828352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
1838352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
1848352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
18545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU8(short v) {
18645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if ((v < 0) || (v > 0xff)) {
1878352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            android.util.Log.e("rs", "FieldPacker.addU8( " + v + " )");
18845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new IllegalArgumentException("Saving value out of range for type");
18945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
19045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)v;
19145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
19245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
19345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU16(int v) {
19445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if ((v < 0) || (v > 0xffff)) {
19545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
19645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new IllegalArgumentException("Saving value out of range for type");
19745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
19845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        align(2);
19945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)(v & 0xff);
20045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)(v >> 8);
20145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
20245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
20345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU32(long v) {
20445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if ((v < 0) || (v > 0xffffffffL)) {
20545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
20645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new IllegalArgumentException("Saving value out of range for type");
20745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
20845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        align(4);
20945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)(v & 0xff);
21045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 8) & 0xff);
21145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 16) & 0xff);
21245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 24) & 0xff);
21345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
21445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
21545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU64(long v) {
21645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (v < 0) {
21745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
21845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new IllegalArgumentException("Saving value out of range for type");
21945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
22045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        align(8);
22145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)(v & 0xff);
22245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 8) & 0xff);
22345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 16) & 0xff);
22445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 24) & 0xff);
22545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 32) & 0xff);
22645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 40) & 0xff);
22745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 48) & 0xff);
22845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mData[mPos++] = (byte)((v >> 56) & 0xff);
22945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
23045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
23145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addF32(float v) {
23245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI32(Float.floatToRawIntBits(v));
23345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
23445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2358352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public float subF32() {
2368352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return Float.intBitsToFloat(subI32());
2378352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
2388352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
23945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addF64(double v) {
24045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI64(Double.doubleToRawLongBits(v));
24145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
24245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2438352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public double subF64() {
2448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return Double.longBitsToDouble(subI64());
2458352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
2468352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
24745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addObj(BaseObj obj) {
24845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (obj != null) {
249bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            if (RenderScript.sPointerSize == 8) {
250bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                addI64(obj.getID(null));
251bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                addI64(0);
252bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                addI64(0);
253bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                addI64(0);
254f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang            } else {
255bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                addI32((int)obj.getID(null));
256bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            }
25745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        } else {
258bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            if (RenderScript.sPointerSize == 8) {
259bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                addI64(0);
260bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                addI64(0);
261bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                addI64(0);
262bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                addI64(0);
263bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            } else {
264bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                addI32(0);
265bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang            }
26645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
26745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
26845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
26945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addF32(Float2 v) {
27045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF32(v.x);
27145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF32(v.y);
27245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
27345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addF32(Float3 v) {
27445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF32(v.x);
27545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF32(v.y);
27645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF32(v.z);
27745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
27845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addF32(Float4 v) {
27945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF32(v.x);
28045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF32(v.y);
28145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF32(v.z);
28245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF32(v.w);
28345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
28445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
28545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addF64(Double2 v) {
28645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF64(v.x);
28745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF64(v.y);
28845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
28945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addF64(Double3 v) {
29045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF64(v.x);
29145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF64(v.y);
29245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF64(v.z);
29345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
29445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addF64(Double4 v) {
29545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF64(v.x);
29645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF64(v.y);
29745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF64(v.z);
29845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addF64(v.w);
29945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
30045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
30145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI8(Byte2 v) {
30245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI8(v.x);
30345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI8(v.y);
30445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
30545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI8(Byte3 v) {
30645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI8(v.x);
30745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI8(v.y);
30845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI8(v.z);
30945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
31045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI8(Byte4 v) {
31145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI8(v.x);
31245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI8(v.y);
31345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI8(v.z);
31445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI8(v.w);
31545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
31645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
31745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU8(Short2 v) {
31845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU8(v.x);
31945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU8(v.y);
32045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
32145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU8(Short3 v) {
32245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU8(v.x);
32345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU8(v.y);
32445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU8(v.z);
32545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
32645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU8(Short4 v) {
32745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU8(v.x);
32845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU8(v.y);
32945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU8(v.z);
33045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU8(v.w);
33145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
33245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
33345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI16(Short2 v) {
33445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI16(v.x);
33545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI16(v.y);
33645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
33745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI16(Short3 v) {
33845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI16(v.x);
33945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI16(v.y);
34045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI16(v.z);
34145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
34245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI16(Short4 v) {
34345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI16(v.x);
34445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI16(v.y);
34545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI16(v.z);
34645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI16(v.w);
34745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
34845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
34945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU16(Int2 v) {
35045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU16(v.x);
35145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU16(v.y);
35245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
35345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU16(Int3 v) {
35445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU16(v.x);
35545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU16(v.y);
35645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU16(v.z);
35745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
35845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU16(Int4 v) {
35945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU16(v.x);
36045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU16(v.y);
36145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU16(v.z);
36245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU16(v.w);
36345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
36445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
36545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI32(Int2 v) {
36645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI32(v.x);
36745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI32(v.y);
36845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
36945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI32(Int3 v) {
37045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI32(v.x);
37145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI32(v.y);
37245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI32(v.z);
37345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
37445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI32(Int4 v) {
37545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI32(v.x);
37645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI32(v.y);
37745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI32(v.z);
37845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI32(v.w);
37945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
38045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
38145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU32(Long2 v) {
38245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU32(v.x);
38345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU32(v.y);
38445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
38545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU32(Long3 v) {
38645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU32(v.x);
38745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU32(v.y);
38845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU32(v.z);
38945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
39045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU32(Long4 v) {
39145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU32(v.x);
39245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU32(v.y);
39345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU32(v.z);
39445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU32(v.w);
39545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
39645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
39745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI64(Long2 v) {
39845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI64(v.x);
39945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI64(v.y);
40045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
40145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI64(Long3 v) {
40245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI64(v.x);
40345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI64(v.y);
40445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI64(v.z);
40545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
40645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addI64(Long4 v) {
40745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI64(v.x);
40845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI64(v.y);
40945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI64(v.z);
41045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI64(v.w);
41145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
41245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
41345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU64(Long2 v) {
41445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU64(v.x);
41545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU64(v.y);
41645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
41745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU64(Long3 v) {
41845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU64(v.x);
41945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU64(v.y);
42045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU64(v.z);
42145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
42245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addU64(Long4 v) {
42345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU64(v.x);
42445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU64(v.y);
42545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU64(v.z);
42645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addU64(v.w);
42745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
42845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
4298352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
4308352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Float2 subFloat2() {
4318352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Float2 v = new Float2();
4328352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subF32();
4338352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subF32();
4348352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
4358352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
4368352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Float3 subFloat3() {
4378352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Float3 v = new Float3();
4388352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.z = subF32();
4398352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subF32();
4408352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subF32();
4418352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
4428352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
4438352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Float4 subFloat4() {
4448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Float4 v = new Float4();
4458352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.w = subF32();
4468352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.z = subF32();
4478352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subF32();
4488352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subF32();
4498352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
4508352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
4518352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
4528352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Double2 subDouble2() {
4538352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Double2 v = new Double2();
4548352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subF64();
4558352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subF64();
4568352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
4578352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
4588352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Double3 subDouble3() {
4598352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Double3 v = new Double3();
4608352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.z = subF64();
4618352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subF64();
4628352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subF64();
4638352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
4648352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
4658352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Double4 subDouble4() {
4668352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Double4 v = new Double4();
4678352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.w = subF64();
4688352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.z = subF64();
4698352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subF64();
4708352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subF64();
4718352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
4728352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
4738352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
4748352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Byte2 subByte2() {
4758352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Byte2 v = new Byte2();
4768352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subI8();
4778352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subI8();
4788352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
4798352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
4808352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Byte3 subByte3() {
4818352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Byte3 v = new Byte3();
4828352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.z = subI8();
4838352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subI8();
4848352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subI8();
4858352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
4868352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
4878352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Byte4 subByte4() {
4888352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Byte4 v = new Byte4();
4898352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.w = subI8();
4908352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.z = subI8();
4918352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subI8();
4928352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subI8();
4938352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
4948352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
4958352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
4968352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Short2 subShort2() {
4978352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Short2 v = new Short2();
4988352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subI16();
4998352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subI16();
5008352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
5018352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
5028352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Short3 subShort3() {
5038352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Short3 v = new Short3();
5048352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.z = subI16();
5058352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subI16();
5068352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subI16();
5078352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
5088352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
5098352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Short4 subShort4() {
5108352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Short4 v = new Short4();
5118352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.w = subI16();
5128352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.z = subI16();
5138352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subI16();
5148352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subI16();
5158352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
5168352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
5178352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
5188352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Int2 subInt2() {
5198352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Int2 v = new Int2();
5208352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subI32();
5218352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subI32();
5228352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
5238352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
5248352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Int3 subInt3() {
5258352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Int3 v = new Int3();
5268352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.z = subI32();
5278352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subI32();
5288352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subI32();
5298352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
5308352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
5318352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Int4 subInt4() {
5328352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Int4 v = new Int4();
5338352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.w = subI32();
5348352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.z = subI32();
5358352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subI32();
5368352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subI32();
5378352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
5388352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
5398352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
5408352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Long2 subLong2() {
5418352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Long2 v = new Long2();
5428352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subI64();
5438352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subI64();
5448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
5458352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
5468352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Long3 subLong3() {
5478352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Long3 v = new Long3();
5488352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.z = subI64();
5498352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subI64();
5508352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subI64();
5518352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
5528352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
5538352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Long4 subLong4() {
5548352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Long4 v = new Long4();
5558352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.w = subI64();
5568352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.z = subI64();
5578352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.y = subI64();
5588352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        v.x = subI64();
5598352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
5608352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
5618352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
5628352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
5638352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
56445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addMatrix(Matrix4f v) {
56545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        for (int i=0; i < v.mMat.length; i++) {
56645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            addF32(v.mMat[i]);
56745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
56845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
56945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
5708352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Matrix4f subMatrix4f() {
5718352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Matrix4f v = new Matrix4f();
5728352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        for (int i = v.mMat.length - 1; i >= 0; i--) {
5738352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            v.mMat[i] = subF32();
5748352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
5758352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
5768352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
5778352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
57845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addMatrix(Matrix3f v) {
57945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        for (int i=0; i < v.mMat.length; i++) {
58045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            addF32(v.mMat[i]);
58145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
58245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
58345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
5848352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Matrix3f subMatrix3f() {
5858352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Matrix3f v = new Matrix3f();
5868352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        for (int i = v.mMat.length - 1; i >= 0; i--) {
5878352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            v.mMat[i] = subF32();
5888352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
5898352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
5908352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
5918352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
59245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addMatrix(Matrix2f v) {
59345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        for (int i=0; i < v.mMat.length; i++) {
59445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            addF32(v.mMat[i]);
59545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
59645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
59745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
5988352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public Matrix2f subMatrix2f() {
5998352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        Matrix2f v = new Matrix2f();
6008352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        for (int i = v.mMat.length - 1; i >= 0; i--) {
6018352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            v.mMat[i] = subF32();
6028352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6038352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return v;
6048352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
6058352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
60645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void addBoolean(boolean v) {
60745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        addI8((byte)(v ? 1 : 0));
60845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
60945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
6108352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    public boolean subBoolean() {
6118352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        byte v = subI8();
6128352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (v == 1) {
6138352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return true;
6148352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6158352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return false;
6168352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
6178352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
61845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public final byte[] getData() {
61945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mData;
62045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
62145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
6228352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    /**
6238352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang     * Get the actual length used for the FieldPacker.
6248352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang     *
6258352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang     * @hide
6268352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang     */
627908f238ae73283a7f3d49ddf7a562ccbd1a9ac44Stephen Hines    public int getPos() {
628908f238ae73283a7f3d49ddf7a562ccbd1a9ac44Stephen Hines        return mPos;
629908f238ae73283a7f3d49ddf7a562ccbd1a9ac44Stephen Hines    }
630908f238ae73283a7f3d49ddf7a562ccbd1a9ac44Stephen Hines
6318352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    private static void addToPack(FieldPacker fp, Object obj) {
6328352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Boolean) {
6338352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addBoolean(((Boolean)obj).booleanValue());
6348352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6358352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6368352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6378352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Byte) {
6388352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI8(((Byte)obj).byteValue());
6398352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6408352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6418352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6428352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Short) {
6438352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI16(((Short)obj).shortValue());
6448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6458352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6468352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6478352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Integer) {
6488352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI32(((Integer)obj).intValue());
6498352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6508352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6518352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6528352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Long) {
6538352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI64(((Long)obj).longValue());
6548352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6558352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6568352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6578352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Float) {
6588352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addF32(((Float)obj).floatValue());
6598352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6608352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6618352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6628352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Double) {
6638352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addF64(((Double)obj).doubleValue());
6648352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6658352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6668352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6678352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Byte2) {
6688352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI8((Byte2)obj);
6698352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6708352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6718352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6728352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Byte3) {
6738352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI8((Byte3)obj);
6748352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6758352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6768352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6778352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Byte4) {
6788352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI8((Byte4)obj);
6798352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6808352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6818352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6828352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Short2) {
6838352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI16((Short2)obj);
6848352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6858352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6868352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6878352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Short3) {
6888352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI16((Short3)obj);
6898352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6908352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6918352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6928352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Short4) {
6938352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI16((Short4)obj);
6948352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
6958352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
6968352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
6978352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Int2) {
6988352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI32((Int2)obj);
6998352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7008352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7018352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7028352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Int3) {
7038352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI32((Int3)obj);
7048352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7058352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7068352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7078352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Int4) {
7088352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI32((Int4)obj);
7098352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7108352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7118352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7128352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Long2) {
7138352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI64((Long2)obj);
7148352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7158352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7168352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7178352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Long3) {
7188352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI64((Long3)obj);
7198352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7208352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7218352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7228352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Long4) {
7238352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addI64((Long4)obj);
7248352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7258352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7268352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7278352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Float2) {
7288352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addF32((Float2)obj);
7298352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7308352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7318352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7328352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Float3) {
7338352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addF32((Float3)obj);
7348352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7358352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7368352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7378352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Float4) {
7388352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addF32((Float4)obj);
7398352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7408352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7418352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7428352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Double2) {
7438352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addF64((Double2)obj);
7448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7458352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7468352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7478352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Double3) {
7488352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addF64((Double3)obj);
7498352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7508352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7518352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7528352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Double4) {
7538352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addF64((Double4)obj);
7548352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7558352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7568352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7578352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Matrix2f) {
7588352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addMatrix((Matrix2f)obj);
7598352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7608352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7618352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7628352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Matrix3f) {
7638352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addMatrix((Matrix3f)obj);
7648352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7658352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7668352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7678352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Matrix4f) {
7688352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addMatrix((Matrix4f)obj);
7698352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7708352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7718352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7728352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof BaseObj) {
7738352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            fp.addObj((BaseObj)obj);
7748352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return;
7758352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7768352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
7778352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7788352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    private static int getPackedSize(Object obj) {
7798352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Boolean) {
7808352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 1;
7818352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7828352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7838352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Byte) {
7848352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 1;
7858352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7868352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7878352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Short) {
7888352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 2;
7898352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7908352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7918352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Integer) {
7928352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 4;
7938352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7948352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7958352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Long) {
7968352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 8;
7978352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
7988352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
7998352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Float) {
8008352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 4;
8018352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8028352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8038352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Double) {
8048352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 8;
8058352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8068352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8078352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Byte2) {
8088352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 2;
8098352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8108352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8118352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Byte3) {
8128352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 3;
8138352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8148352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8158352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Byte4) {
8168352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 4;
8178352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8188352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8198352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Short2) {
8208352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 4;
8218352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8228352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8238352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Short3) {
8248352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 6;
8258352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8268352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8278352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Short4) {
8288352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 8;
8298352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8308352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8318352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Int2) {
8328352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 8;
8338352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8348352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8358352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Int3) {
8368352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 12;
8378352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8388352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8398352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Int4) {
8408352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 16;
8418352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8428352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8438352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Long2) {
8448352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 16;
8458352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8468352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8478352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Long3) {
8488352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 24;
8498352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8508352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8518352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Long4) {
8528352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 32;
8538352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8548352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8558352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Float2) {
8568352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 8;
8578352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8588352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8598352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Float3) {
8608352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 12;
8618352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8628352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8638352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Float4) {
8648352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 16;
8658352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8668352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8678352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Double2) {
8688352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 16;
8698352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8708352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8718352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Double3) {
8728352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 24;
8738352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8748352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8758352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Double4) {
8768352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 32;
8778352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8788352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8798352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Matrix2f) {
8808352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 16;
8818352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8828352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8838352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Matrix3f) {
8848352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 36;
8858352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8868352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8878352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof Matrix4f) {
8888352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            return 64;
8898352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8908352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8918352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        if (obj instanceof BaseObj) {
8928352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            if (RenderScript.sPointerSize == 8) {
8938352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang                return 32;
8948352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            } else {
8958352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang                return 4;
8968352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            }
8978352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
8988352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
8998352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return 0;
9008352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
9018352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
9028352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    static FieldPacker createFieldPack(Object[] args) {
9038352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        int len = 0;
9048352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        for (Object arg : args) {
9058352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            len += getPackedSize(arg);
9068352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
9078352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        FieldPacker fp = new FieldPacker(len);
9088352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        for (Object arg : args) {
9098352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang            addToPack(fp, arg);
9108352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        }
9118352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang        return fp;
9128352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    }
9138352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
914f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang
915f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang    private boolean resize(int newSize) {
916f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        if (newSize == mLen) {
917f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang            return false;
918f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        }
919f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang
920f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        byte[] newData = new byte[newSize];
921f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        System.arraycopy(mData, 0, newData, 0, mPos);
922f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        mData = newData;
923f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        mLen = newSize;
924f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        return true;
925f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang    }
926f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang
927f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang    private void addSafely(Object obj) {
928f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        boolean retry;
929f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        final int oldPos = mPos;
930f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        do {
931f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang            retry = false;
932f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang            try {
933f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang                addToPack(this, obj);
934f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang            } catch (ArrayIndexOutOfBoundsException e) {
935f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang                mPos = oldPos;
936f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang                resize(mLen * 2);
937f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang                retry = true;
938f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang            }
939f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang        } while (retry);
940f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang    }
941f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang
942f90ba2cc2cbb5a5dbcfaa97f2ee6f0c6a74a78a5Miao Wang    private byte mData[];
94345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    private int mPos;
94445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    private int mLen;
945bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    private BitSet mAlignment;
94645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams}
947