diff options
Diffstat (limited to 'rs/java/android/renderscript/FieldPacker.java')
-rw-r--r-- | rs/java/android/renderscript/FieldPacker.java | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/rs/java/android/renderscript/FieldPacker.java b/rs/java/android/renderscript/FieldPacker.java index 723ab24..20b07e7 100644 --- a/rs/java/android/renderscript/FieldPacker.java +++ b/rs/java/android/renderscript/FieldPacker.java @@ -36,10 +36,15 @@ public class FieldPacker { } public FieldPacker(byte[] data) { - mPos = 0; + // Advance mPos to the end of the buffer, since we are copying in the + // full data input. + mPos = data.length; mLen = data.length; mData = data; mAlignment = new BitSet(); + // TODO: We should either have an actual FieldPacker copy constructor + // or drop support for computing alignment like this. As it stands, + // subAlign() can never work correctly for copied FieldPacker objects. } public void align(int v) { @@ -75,7 +80,7 @@ public class FieldPacker { mPos = 0; } public void reset(int i) { - if ((i < 0) || (i >= mLen)) { + if ((i < 0) || (i > mLen)) { throw new RSIllegalArgumentException("out of range argument: " + i); } mPos = i; @@ -231,10 +236,24 @@ public class FieldPacker { public void addObj(BaseObj obj) { if (obj != null) { - // FIXME: this is fine for 32-bit but needs a path for 64-bit - addI32((int)obj.getID(null)); + if (RenderScript.sPointerSize == 8) { + addI64(obj.getID(null)); + addI64(0); + addI64(0); + addI64(0); + } + else { + addI32((int)obj.getID(null)); + } } else { - addI32(0); + if (RenderScript.sPointerSize == 8) { + addI64(0); + addI64(0); + addI64(0); + addI64(0); + } else { + addI32(0); + } } } @@ -591,6 +610,15 @@ public class FieldPacker { return mData; } + /** + * Get the actual length used for the FieldPacker. + * + * @hide + */ + public int getPos() { + return mPos; + } + private final byte mData[]; private int mPos; private int mLen; |