am 1004f0d0: am 3cab30a1: Merge "Create compat FieldPacker.getPos() to get the actual amount of data used for FP."

* commit '1004f0d0310eac235fa2c81d88ac8688628788ca':
  Create compat FieldPacker.getPos() to get the actual amount of data used for FP.
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/Allocation.java b/v8/renderscript/java/src/android/support/v8/renderscript/Allocation.java
index 8b17aab..eec493c 100644
--- a/v8/renderscript/java/src/android/support/v8/renderscript/Allocation.java
+++ b/v8/renderscript/java/src/android/support/v8/renderscript/Allocation.java
@@ -643,10 +643,11 @@
         mRS.validate();
         int eSize = mType.mElement.getBytesSize();
         final byte[] data = fp.getData();
+        int data_length = fp.getPos();
 
-        int count = data.length / eSize;
-        if ((eSize * count) != data.length) {
-            throw new RSIllegalArgumentException("Field packer length " + data.length +
+        int count = data_length / eSize;
+        if ((eSize * count) != data_length) {
+            throw new RSIllegalArgumentException("Field packer length " + data_length +
                                                " not divisible by element size " + eSize + ".");
         }
         copy1DRangeFromUnchecked(xoff, count, data);
@@ -670,16 +671,17 @@
         }
 
         final byte[] data = fp.getData();
+        int data_length = fp.getPos();
         int eSize = mType.mElement.mElements[component_number].getBytesSize();
         eSize *= mType.mElement.mArraySizes[component_number];
 
-        if (data.length != eSize) {
-            throw new RSIllegalArgumentException("Field packer sizelength " + data.length +
+        if (data_length != eSize) {
+            throw new RSIllegalArgumentException("Field packer sizelength " + data_length +
                                                " does not match component size " + eSize + ".");
         }
 
         mRS.nAllocationElementData1D(getIDSafe(), xoff, mSelectedLOD,
-                                     component_number, data, data.length);
+                                     component_number, data, data_length);
     }
 
     private void data1DChecks(int off, int count, int len, int dataSize) {
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/AllocationThunker.java b/v8/renderscript/java/src/android/support/v8/renderscript/AllocationThunker.java
index f3eb0da..2ae7edf 100644
--- a/v8/renderscript/java/src/android/support/v8/renderscript/AllocationThunker.java
+++ b/v8/renderscript/java/src/android/support/v8/renderscript/AllocationThunker.java
@@ -195,8 +195,15 @@
 
     public void setFromFieldPacker(int xoff, FieldPacker fp) {
         try {
+            // Must construct actual FieldPacker from scratch, since we don't
+            // know how many bytes were actually used.
+            byte[] data = fp.getData();
+            int fp_length = fp.getPos();
             android.renderscript.FieldPacker nfp =
-                new android.renderscript.FieldPacker(fp.getData());
+                new android.renderscript.FieldPacker(fp_length);
+            for (int i = 0; i < fp_length; i++) {
+                nfp.addI8(data[i]);
+            }
             mN.setFromFieldPacker(xoff, nfp);
         } catch (android.renderscript.RSRuntimeException e) {
             throw ExceptionThunker.convertException(e);
@@ -204,8 +211,15 @@
     }
     public void setFromFieldPacker(int xoff, int component_number, FieldPacker fp) {
         try {
+            // Must construct actual FieldPacker from scratch, since we don't
+            // know how many bytes were actually used.
+            byte[] data = fp.getData();
+            int fp_length = fp.getPos();
             android.renderscript.FieldPacker nfp =
-                new android.renderscript.FieldPacker(fp.getData());
+                new android.renderscript.FieldPacker(fp_length);
+            for (int i = 0; i < fp_length; i++) {
+                nfp.addI8(data[i]);
+            }
             mN.setFromFieldPacker(xoff, component_number, nfp);
         } catch (android.renderscript.RSRuntimeException e) {
             throw ExceptionThunker.convertException(e);
@@ -495,4 +509,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/FieldPacker.java b/v8/renderscript/java/src/android/support/v8/renderscript/FieldPacker.java
index ffdb66f..1e54631 100644
--- a/v8/renderscript/java/src/android/support/v8/renderscript/FieldPacker.java
+++ b/v8/renderscript/java/src/android/support/v8/renderscript/FieldPacker.java
@@ -544,6 +544,13 @@
         return mData;
     }
 
+    public int getPos() {
+        if (RenderScript.shouldThunk()) {
+            return mN.getPos();
+        }
+        return mPos;
+    }
+
     private final byte mData[];
     private int mPos;
     private int mLen;
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/FieldPackerThunker.java b/v8/renderscript/java/src/android/support/v8/renderscript/FieldPackerThunker.java
index 3e990f6..fe021e1 100644
--- a/v8/renderscript/java/src/android/support/v8/renderscript/FieldPackerThunker.java
+++ b/v8/renderscript/java/src/android/support/v8/renderscript/FieldPackerThunker.java
@@ -30,65 +30,83 @@
  **/
 public class FieldPackerThunker {
     private android.renderscript.FieldPacker mN;
+    private int mPos;
 
     public FieldPackerThunker(int len) {
         mN = new android.renderscript.FieldPacker(len);
+        mPos = 0;
     }
 
     void align(int v) {
         mN.align(v);
+        while ((mPos & (v - 1)) != 0) {
+            mPos++;
+        }
     }
 
     void reset() {
         mN.reset();
+        mPos = 0;
     }
 
     void reset(int i) {
         mN.reset(i);
+        mPos = i;
     }
 
     public void skip(int i) {
         mN.skip(i);
+        mPos += i;
     }
 
     public void addI8(byte v) {
         mN.addI8(v);
+        mPos++;
     }
 
     public void addI16(short v) {
         mN.addI16(v);
+        mPos += 2;
     }
 
     public void addI32(int v) {
         mN.addI32(v);
+        mPos += 4;
     }
 
     public void addI64(long v) {
         mN.addI64(v);
+        mPos += 8;
     }
 
     public void addU8(short v) {
         mN.addU8(v);
+        mPos++;
     }
 
     public void addU16(int v) {
         mN.addU16(v);
+        mPos += 2;
     }
 
     public void addU32(long v) {
         mN.addU32(v);
+        mPos += 4;
     }
 
     public void addU64(long v) {
         mN.addU64(v);
+        mPos += 8;
     }
 
     public void addF32(float v) {
         mN.addF32(v);
+        mPos += 4;
     }
 
     public void addF64(double v) {
         mN.addF64(v);
+        mPos += 8;
     }
 
     public void addObj(BaseObj obj) {
@@ -97,127 +115,167 @@
         } else {
             mN.addObj(null);
         }
+        mPos += 4;  // Compat lib only works in 32-bit mode, so objects are 4 bytes.
     }
 
     public void addF32(Float2 v) {
         mN.addF32(new android.renderscript.Float2(v.x, v.y));
+        mPos += 8;
     }
     public void addF32(Float3 v) {
         mN.addF32(new android.renderscript.Float3(v.x, v.y, v.z));
+        mPos += 12;
     }
     public void addF32(Float4 v) {
         mN.addF32(new android.renderscript.Float4(v.x, v.y, v.z, v.w));
+        mPos += 16;
     }
 
     public void addF64(Double2 v) {
         mN.addF64(new android.renderscript.Double2(v.x, v.y));
+        mPos += 16;
     }
     public void addF64(Double3 v) {
         mN.addF64(new android.renderscript.Double3(v.x, v.y, v.z));
+        mPos += 24;
     }
     public void addF64(Double4 v) {
         mN.addF64(new android.renderscript.Double4(v.x, v.y, v.z, v.w));
+        mPos += 32;
     }
 
     public void addI8(Byte2 v) {
         mN.addI8(new android.renderscript.Byte2(v.x, v.y));
+        mPos += 2;
     }
     public void addI8(Byte3 v) {
         mN.addI8(new android.renderscript.Byte3(v.x, v.y, v.z));
+        mPos += 3;
     }
     public void addI8(Byte4 v) {
         mN.addI8(new android.renderscript.Byte4(v.x, v.y, v.z, v.w));
+        mPos += 4;
     }
 
     public void addU8(Short2 v) {
         mN.addU8(new android.renderscript.Short2(v.x, v.y));
+        mPos += 2;
     }
     public void addU8(Short3 v) {
         mN.addU8(new android.renderscript.Short3(v.x, v.y, v.z));
+        mPos += 3;
     }
     public void addU8(Short4 v) {
         mN.addU8(new android.renderscript.Short4(v.x, v.y, v.z, v.w));
+        mPos += 4;
     }
 
     public void addI16(Short2 v) {
         mN.addI16(new android.renderscript.Short2(v.x, v.y));
+        mPos += 4;
     }
     public void addI16(Short3 v) {
         mN.addI16(new android.renderscript.Short3(v.x, v.y, v.z));
+        mPos += 6;
     }
     public void addI16(Short4 v) {
         mN.addI16(new android.renderscript.Short4(v.x, v.y, v.z, v.w));
+        mPos += 8;
     }
 
     public void addU16(Int2 v) {
         mN.addU16(new android.renderscript.Int2(v.x, v.y));
+        mPos += 4;
     }
     public void addU16(Int3 v) {
         mN.addU16(new android.renderscript.Int3(v.x, v.y, v.z));
+        mPos += 6;
     }
     public void addU16(Int4 v) {
         mN.addU16(new android.renderscript.Int4(v.x, v.y, v.z, v.w));
+        mPos += 8;
     }
 
     public void addI32(Int2 v) {
         mN.addI32(new android.renderscript.Int2(v.x, v.y));
+        mPos += 8;
     }
     public void addI32(Int3 v) {
         mN.addI32(new android.renderscript.Int3(v.x, v.y, v.z));
+        mPos += 12;
     }
     public void addI32(Int4 v) {
         mN.addI32(new android.renderscript.Int4(v.x, v.y, v.z, v.w));
+        mPos += 16;
     }
 
     public void addU32(Long2 v) {
         mN.addU32(new android.renderscript.Long2(v.x, v.y));
+        mPos += 8;
     }
     public void addU32(Long3 v) {
         mN.addU32(new android.renderscript.Long3(v.x, v.y, v.z));
+        mPos += 12;
     }
     public void addU32(Long4 v) {
         mN.addU32(new android.renderscript.Long4(v.x, v.y, v.z, v.w));
+        mPos += 16;
     }
 
     public void addI64(Long2 v) {
         mN.addI64(new android.renderscript.Long2(v.x, v.y));
+        mPos += 16;
     }
     public void addI64(Long3 v) {
         mN.addI64(new android.renderscript.Long3(v.x, v.y, v.z));
+        mPos += 24;
     }
     public void addI64(Long4 v) {
         mN.addI64(new android.renderscript.Long4(v.x, v.y, v.z, v.w));
+        mPos += 32;
     }
 
     public void addU64(Long2 v) {
         mN.addU64(new android.renderscript.Long2(v.x, v.y));
+        mPos += 16;
     }
     public void addU64(Long3 v) {
         mN.addU64(new android.renderscript.Long3(v.x, v.y, v.z));
+        mPos += 24;
     }
     public void addU64(Long4 v) {
         mN.addU64(new android.renderscript.Long4(v.x, v.y, v.z, v.w));
+        mPos += 32;
     }
 
     public void addMatrix(Matrix4f v) {
         mN.addMatrix(new android.renderscript.Matrix4f(v.getArray()));
+        mPos += (4 * 4 * 4);
     }
 
     public void addMatrix(Matrix3f v) {
         mN.addMatrix(new android.renderscript.Matrix3f(v.getArray()));
+        mPos += (3 * 3 * 4);
     }
 
     public void addMatrix(Matrix2f v) {
         mN.addMatrix(new android.renderscript.Matrix2f(v.getArray()));
+        mPos += (2 * 2 * 4);
     }
 
     public void addBoolean(boolean v) {
         mN.addBoolean(v);
+        mPos++;
     }
 
     public final byte[] getData() {
         return mN.getData();
     }
+
+    // We must compute our own mPos, since this API is not available in older target APIs.
+    public int getPos() {
+        return mPos;
+    }
 }