Properly handle dirty rectangles generated from 9-patches
Bug #3409580

This bug affects anything that draws a 9patch inside a layer, this includes
launcher's workspace, all of the fade animations, etc.

Change-Id: Icbe8ecd158e3d5f44d07516462de68c5d1fb0a8f
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 90d6ea1..8ee7ec3 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -1217,17 +1217,18 @@
 #if RENDER_LAYERS_AS_REGIONS
         // Mark the current layer dirty where we are going to draw the patch
         if (hasLayer() && mesh->hasEmptyQuads) {
+            const float offsetX = left + mSnapshot->transform->getTranslateX();
+            const float offsetY = top + mSnapshot->transform->getTranslateY();
             const size_t count = mesh->quads.size();
             for (size_t i = 0; i < count; i++) {
                 const Rect& bounds = mesh->quads.itemAt(i);
                 if (pureTranslate) {
-                    const float x = (int) floorf(bounds.left + 0.5f);
-                    const float y = (int) floorf(bounds.top + 0.5f);
-                    dirtyLayer(x, y, x + bounds.getWidth(), y + bounds.getHeight(),
-                            *mSnapshot->transform);
+                    const float x = (int) floorf(bounds.left + offsetX + 0.5f);
+                    const float y = (int) floorf(bounds.top + offsetY + 0.5f);
+                    dirtyLayer(x, y, x + bounds.getWidth(), y + bounds.getHeight());
                 } else {
-                    dirtyLayer(bounds.left, bounds.top, bounds.right, bounds.bottom,
-                            *mSnapshot->transform);
+                    dirtyLayer(left + bounds.left, top + bounds.top,
+                            left + bounds.right, top + bounds.bottom, *mSnapshot->transform);
                 }
             }
         }