Merge "Add getTransformMatrix to the SurfaceTexture API." into honeycomb
diff --git a/api/current.xml b/api/current.xml
index 9cc3370..0c33b8c 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -86209,6 +86209,19 @@
 <parameter name="texName" type="int">
 </parameter>
 </constructor>
+<method name="getTransformMatrix"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="mtx" type="float[]">
+</parameter>
+</method>
 <method name="setOnFrameAvailableListener"
  return="void"
  abstract="false"
diff --git a/core/jni/android/graphics/SurfaceTexture.cpp b/core/jni/android/graphics/SurfaceTexture.cpp
index 2645045..c1229f3 100644
--- a/core/jni/android/graphics/SurfaceTexture.cpp
+++ b/core/jni/android/graphics/SurfaceTexture.cpp
@@ -82,6 +82,15 @@
     surfaceTexture->updateTexImage();
 }
 
+static void SurfaceTexture_getTransformMatrix(JNIEnv* env, jobject clazz,
+        jfloatArray jmtx)
+{
+    sp<SurfaceTexture> surfaceTexture(getSurfaceTexture(env, clazz));
+    float* mtx = env->GetFloatArrayElements(jmtx, NULL);
+    surfaceTexture->getTransformMatrix(mtx);
+    env->ReleaseFloatArrayElements(jmtx, mtx, 0);
+}
+
 // ----------------------------------------------------------------------------
 
 const char* const kSurfaceTextureClassPathName = "android/graphics/SurfaceTexture";
@@ -91,6 +100,7 @@
     {"nativeClassInit",     "()V",  (void*)nativeClassInit },
     {"init",                "(I)V", (void*)SurfaceTexture_init },
     {"updateTexImage",      "()V",  (void*)SurfaceTexture_updateTexImage },
+    {"getTransformMatrixImpl", "([F)V",  (void*)SurfaceTexture_getTransformMatrix },
 };
 
 static void nativeClassInit(JNIEnv* env, jclass clazz)
diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java
index 883c4eb..3eb0b03 100644
--- a/graphics/java/android/graphics/SurfaceTexture.java
+++ b/graphics/java/android/graphics/SurfaceTexture.java
@@ -79,6 +79,31 @@
      */
     public native void updateTexImage();
 
+
+    /**
+     * Retrieve the 4x4 texture coordinate transform matrix associated with the texture image set by
+     * the most recent call to updateTexImage.
+     *
+     * This transform matrix maps 2D homogeneous texture coordinates of the form (s, t, 0, 1) with s
+     * and t in the inclusive range [0, 1] to the texture coordinate that should be used to sample
+     * that location from the texture.  Sampling the texture outside of the range of this transform
+     * is undefined.
+     *
+     * The matrix is stored in column-major order so that it may be passed directly to OpenGL ES via
+     * the glLoadMatrixf or glUniformMatrix4fv functions.
+     *
+     * @param mtx the array into which the 4x4 matrix will be stored.  The array must have exactly
+     *     16 elements.
+     */
+    public void getTransformMatrix(float[] mtx) {
+        if (mtx.length != 16) {
+            throw new IllegalArgumentException();
+        }
+        getTransformMatrixImpl(mtx);
+    }
+
+    private native void getTransformMatrixImpl(float[] mtx);
+
     private native void init(int texName);
 
     /*