Actually fix pixelcopy for 90/180/270 rotation

Bug: 33421965
Test: PixelCopyTest testWindow* CTS tests
Change-Id: I1b49b3643c5d030c3d2de95de4a0ce3a4ff0111d
diff --git a/libs/hwui/OpenGLReadback.cpp b/libs/hwui/OpenGLReadback.cpp
index 74a8395..4c8abc5 100644
--- a/libs/hwui/OpenGLReadback.cpp
+++ b/libs/hwui/OpenGLReadback.cpp
@@ -108,6 +108,15 @@
     return copyGraphicBufferInto(graphicBuffer, transform, srcRect, bitmap);
 }
 
+static float sFlipVInit[16] = {
+    1, 0, 0, 0,
+    0, -1, 0, 0,
+    0, 0, 1, 0,
+    0, 1, 0, 1,
+};
+
+static const Matrix4 sFlipV(sFlipVInit);
+
 ////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////
 
@@ -183,11 +192,15 @@
 
         Matrix4 croppedTexTransform(texTransform);
         if (!srcRect.isEmpty()) {
-            croppedTexTransform.loadTranslate(srcRect.left / sourceTexture.width(),
+            // We flipV to convert to 0,0 top-left for the srcRect
+            // coordinates then flip back to 0,0 bottom-left for
+            // GLES coordinates.
+            croppedTexTransform.multiply(sFlipV);
+            croppedTexTransform.translate(srcRect.left / sourceTexture.width(),
                     srcRect.top / sourceTexture.height(), 0);
             croppedTexTransform.scale(srcRect.getWidth() / sourceTexture.width(),
                     srcRect.getHeight() / sourceTexture.height(), 1);
-            croppedTexTransform.multiply(texTransform);
+            croppedTexTransform.multiply(sFlipV);
         }
         Glop glop;
         GlopBuilder(renderState, caches, &glop)