Yet another fix for 9patch rendering.
Bug #3362133

Change-Id: Ia6521d31a8c208a2ad2506a23b6a01e5e442ad86
diff --git a/libs/hwui/Patch.cpp b/libs/hwui/Patch.cpp
index 77cbb80..535c0ac 100644
--- a/libs/hwui/Patch.cpp
+++ b/libs/hwui/Patch.cpp
@@ -154,7 +154,8 @@
     float y1 = 0.0f;
     float v1 = 0.0f;
 
-    for (uint32_t i = 0; i < mYCount; i++) {
+    uint32_t i = 0;
+    for ( ; i < mYCount; i++) {
         float stepY = mYDivs[i];
 
         float y2 = 0.0f;
@@ -166,7 +167,8 @@
         }
         float v2 = fmax(0.0f, stepY - 0.5f) / bitmapHeight;
 
-        generateRow(vertex, y1, y2, v1, v2, stretchX, right - left, bitmapWidth, quadCount);
+        generateRow(vertex, y1, y2, v1, v2, stretchX, right - left,
+                bitmapWidth, quadCount, i & 1);
 
         y1 = y2;
         v1 = (stepY + 0.5f) / bitmapHeight;
@@ -175,7 +177,7 @@
     }
 
     generateRow(vertex, y1, bottom - top, v1, 1.0f, stretchX, right - left,
-            bitmapWidth, quadCount);
+            bitmapWidth, quadCount, i & 1);
 
     if (verticesCount > 0) {
         Caches::getInstance().bindMeshBuffer(meshBuffer);
@@ -193,14 +195,15 @@
 }
 
 void Patch::generateRow(TextureVertex*& vertex, float y1, float y2, float v1, float v2,
-        float stretchX, float width, float bitmapWidth, uint32_t& quadCount) {
+        float stretchX, float width, float bitmapWidth, uint32_t& quadCount, bool isStretch) {
     float previousStepX = 0.0f;
 
     float x1 = 0.0f;
     float u1 = 0.0f;
 
     // Generate the row quad by quad
-    for (uint32_t i = 0; i < mXCount; i++) {
+    uint32_t i = 0;
+    for ( ; i < mXCount; i++) {
         float stepX = mXDivs[i];
 
         float x2 = 0.0f;
@@ -212,7 +215,7 @@
         }
         float u2 = fmax(0.0f, stepX - 0.5f) / bitmapWidth;
 
-        bool valid = generateQuad(vertex, x1, y1, x2, y2, u1, v1, u2, v2, quadCount);
+        generateQuad(vertex, x1, y1, x2, y2, u1, v1, u2, v2, quadCount, isStretch || (i & 1));
 
         x1 = x2;
         u1 = (stepX + 0.5f) / bitmapWidth;
@@ -220,13 +223,13 @@
         previousStepX = stepX;
     }
 
-    generateQuad(vertex, x1, y1, width, y2, u1, v1, 1.0f, v2, quadCount);
+    generateQuad(vertex, x1, y1, width, y2, u1, v1, 1.0f, v2, quadCount, isStretch || (i & 1));
 }
 
-bool Patch::generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, float y2,
-            float u1, float v1, float u2, float v2, uint32_t& quadCount) {
+void Patch::generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, float y2,
+            float u1, float v1, float u2, float v2, uint32_t& quadCount, bool isStretch) {
     const uint32_t oldQuadCount = quadCount;
-    const bool valid = x2 >= x1 && y2 >= y1;
+    const bool valid = isStretch || (x2 - x1 > 0.9999f && y2 - y1 > 0.9999f);
     if (valid) {
         quadCount++;
     }
@@ -238,7 +241,7 @@
         PATCH_LOGD("        left,  top    = %.2f, %.2f\t\tu1, v1 = %.2f, %.2f", x1, y1, u1, v1);
         PATCH_LOGD("        right, bottom = %.2f, %.2f\t\tu2, v2 = %.2f, %.2f", x2, y2, u2, v2);
 #endif
-        return false;
+        return;
     }
 
 #if RENDER_LAYERS_AS_REGIONS
@@ -267,8 +270,6 @@
     PATCH_LOGD("        left,  top    = %.2f, %.2f\t\tu1, v1 = %.2f, %.2f", x1, y1, u1, v1);
     PATCH_LOGD("        right, bottom = %.2f, %.2f\t\tu2, v2 = %.2f, %.2f", x2, y2, u2, v2);
 #endif
-
-    return true;
 }
 
 }; // namespace uirenderer