Add a getNativeMatrix() API.

This API can be used by WebView to apply the appropriate transform
on its rendering.

Change-Id: I79aa39a29805f462fb08226370328815e74bdc52
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java
index 2fadb82..d78c68a 100644
--- a/core/java/android/view/GLES20Canvas.java
+++ b/core/java/android/view/GLES20Canvas.java
@@ -320,6 +320,13 @@
     private native void nSetMatrix(int renderer, int matrix);
 
     @Override
+    public int getNativeMatrix() {
+        return nGetMatrix(mRenderer);
+    }
+
+    private native int nGetMatrix(int renderer);    
+
+    @Override
     public void getMatrix(Matrix matrix) {
         nGetMatrix(mRenderer, matrix.native_instance);
     }
diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp
index dfa614c..cfa9a27 100644
--- a/core/jni/android_view_GLES20Canvas.cpp
+++ b/core/jni/android_view_GLES20Canvas.cpp
@@ -218,6 +218,11 @@
     renderer->setMatrix(matrix);
 }
 
+static const float* android_view_GLES20Canvas_getNativeMatrix(JNIEnv* env,
+        jobject canvas, OpenGLRenderer* renderer) {
+    return renderer->getMatrix();
+}
+
 static void android_view_GLES20Canvas_getMatrix(JNIEnv* env, jobject canvas,
         OpenGLRenderer* renderer, SkMatrix* matrix) {
     renderer->getMatrix(matrix);
@@ -468,6 +473,7 @@
     { "nScale",             "(IFF)V",          (void*) android_view_GLES20Canvas_scale },
 
     { "nSetMatrix",         "(II)V",           (void*) android_view_GLES20Canvas_setMatrix },
+    { "nGetMatrix",         "(I)I",            (void*) android_view_GLES20Canvas_getNativeMatrix },
     { "nGetMatrix",         "(II)V",           (void*) android_view_GLES20Canvas_getMatrix },
     { "nConcatMatrix",      "(II)V",           (void*) android_view_GLES20Canvas_concatMatrix },
 
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 952f2b5..07fe66c 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -447,6 +447,16 @@
     public void getMatrix(Matrix ctm) {
         native_getCTM(mNativeCanvas, ctm.native_instance);
     }
+
+    /**
+     * Returns a pointer to an internal 4x4 native matrix. The returned
+     * pointer is a pointer to an array of 16 floats.
+     * 
+     * @hide
+     */
+    public int getNativeMatrix() {
+        return 0;
+    }
     
     /**
      * Return a new matrix with a copy of the canvas' current transformation
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index ffd0aed..92875b1 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -584,6 +584,10 @@
     mSnapshot->transform->load(*matrix);
 }
 
+const float* OpenGLRenderer::getMatrix() const {
+    return &mSnapshot->transform->data[0];
+}
+
 void OpenGLRenderer::getMatrix(SkMatrix* matrix) {
     mSnapshot->transform->copyTo(*matrix);
 }
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index 9900a27..f8828e2 100644
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -87,6 +87,7 @@
     virtual void rotate(float degrees);
     virtual void scale(float sx, float sy);
 
+    const float* getMatrix() const;
     void getMatrix(SkMatrix* matrix);
     virtual void setMatrix(SkMatrix* matrix);
     virtual void concatMatrix(SkMatrix* matrix);