Update 9patch structure when rendering with different divs/colors.
Bug #3221488

Change-Id: Ifc9e42a991d630feadc9e8032322f37504d09d6d
diff --git a/libs/hwui/Patch.h b/libs/hwui/Patch.h
index 1e78b2f..2cb8ecb 100644
--- a/libs/hwui/Patch.h
+++ b/libs/hwui/Patch.h
@@ -35,55 +35,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 /**
- * Description of a patch.
- */
-struct PatchDescription {
-    PatchDescription(): bitmapWidth(0), bitmapHeight(0), pixelWidth(0), pixelHeight(0),
-            xCount(0), yCount(0), emptyCount(0), colorKey(0) { }
-    PatchDescription(const float bitmapWidth, const float bitmapHeight,
-            const float pixelWidth, const float pixelHeight,
-            const uint32_t xCount, const uint32_t yCount,
-            const int8_t emptyCount, const uint32_t colorKey):
-            bitmapWidth(bitmapWidth), bitmapHeight(bitmapHeight),
-            pixelWidth(pixelWidth), pixelHeight(pixelHeight),
-            xCount(xCount), yCount(yCount),
-            emptyCount(emptyCount), colorKey(colorKey) { }
-    PatchDescription(const PatchDescription& description):
-            bitmapWidth(description.bitmapWidth), bitmapHeight(description.bitmapHeight),
-            pixelWidth(description.pixelWidth), pixelHeight(description.pixelHeight),
-            xCount(description.xCount), yCount(description.yCount),
-            emptyCount(description.emptyCount), colorKey(description.colorKey) { }
-
-    float bitmapWidth;
-    float bitmapHeight;
-    float pixelWidth;
-    float pixelHeight;
-    uint32_t xCount;
-    uint32_t yCount;
-    int8_t emptyCount;
-    uint32_t colorKey;
-
-    bool operator<(const PatchDescription& rhs) const {
-        LTE_FLOAT(bitmapWidth) {
-            LTE_FLOAT(bitmapHeight) {
-                LTE_FLOAT(pixelWidth) {
-                    LTE_FLOAT(pixelHeight) {
-                        LTE_INT(xCount) {
-                            LTE_INT(yCount) {
-                                LTE_INT(emptyCount) {
-                                    LTE_INT(colorKey) return false;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return false;
-    }
-}; // struct PatchDescription
-
-/**
  * An OpenGL patch. This contains an array of vertices and an array of
  * indices to render the vertices.
  */
@@ -92,10 +43,11 @@
     ~Patch();
 
     void updateVertices(const float bitmapWidth, const float bitmapHeight,
-            float left, float top, float right, float bottom,
-            const int32_t* xDivs, const int32_t* yDivs,
-            const uint32_t width, const uint32_t height,
-            const uint32_t colorKey = 0);
+            float left, float top, float right, float bottom);
+
+    void updateColorKey(const uint32_t colorKey);
+    void copy(const int32_t* xDivs, const int32_t* yDivs);
+    bool matches(const int32_t* xDivs, const int32_t* yDivs, const uint32_t colorKey);
 
     GLuint meshBuffer;
     uint32_t verticesCount;
@@ -104,15 +56,23 @@
 
 private:
     TextureVertex* mVertices;
+    bool mUploaded;
+
+    uint32_t mXCount;
+    int32_t* mXDivs;
+    uint32_t mYCount;
+    int32_t* mYDivs;
+    uint32_t mColorKey;
+
+    void copy(const int32_t* yDivs);
 
     void generateRow(TextureVertex*& vertex, float y1, float y2,
-            float v1, float v2, const int32_t xDivs[], uint32_t xCount,
-            float stretchX, float width, float bitmapWidth,
-            uint32_t& quadCount, const uint32_t colorKey);
+            float v1, float v2, float stretchX, float width, float bitmapWidth,
+            uint32_t& quadCount);
     void generateQuad(TextureVertex*& vertex,
             float x1, float y1, float x2, float y2,
             float u1, float v1, float u2, float v2,
-            uint32_t& quadCount, const uint32_t colorKey);
+            uint32_t& quadCount);
 }; // struct Patch
 
 }; // namespace uirenderer