Reduce the number of active texture changes

Change-Id: I94046bdfe20740c26c8183822e3002d692fde7c4
diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp
index 27556d9..3c6a952 100644
--- a/libs/hwui/FontRenderer.cpp
+++ b/libs/hwui/FontRenderer.cpp
@@ -615,6 +615,8 @@
         return;
     }
 
+    Caches& caches = Caches::getInstance();
+    GLuint lastTextureId = 0;
     // Iterate over all the cache lines and see which ones need to be updated
     for (uint32_t i = 0; i < mCacheLines.size(); i++) {
         CacheTextureLine* cl = mCacheLines[i];
@@ -626,7 +628,11 @@
             uint32_t height  = cl->mMaxHeight;
             void* textureData = cacheTexture->mTexture + (yOffset * width);
 
-            glBindTexture(GL_TEXTURE_2D, cacheTexture->mTextureId);
+            if (cacheTexture->mTextureId != lastTextureId) {
+                caches.activeTexture(0);
+                glBindTexture(GL_TEXTURE_2D, cacheTexture->mTextureId);
+                lastTextureId = cacheTexture->mTextureId;
+            }
             glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, width, height,
                     GL_ALPHA, GL_UNSIGNED_BYTE, textureData);
 
@@ -644,6 +650,7 @@
     checkTextureUpdate();
 
     Caches& caches = Caches::getInstance();
+    caches.bindIndicesBuffer(mIndexBufferID);
     if (!mDrawn) {
         float* buffer = mTextMeshPtr;
         int offset = 2;
@@ -654,7 +661,6 @@
                 buffer + offset);
     }
 
-    caches.bindIndicesBuffer(mIndexBufferID);
     glDrawElements(GL_TRIANGLES, mCurrentQuadIndex * 6, GL_UNSIGNED_SHORT, NULL);
 
     mDrawn = true;
@@ -779,6 +785,7 @@
         return image;
     }
 
+    mDrawn = false;
     mClip = NULL;
     mBounds = NULL;
 
@@ -806,6 +813,7 @@
     image.image = dataBuffer;
     image.penX = penX;
     image.penY = penY;
+
     return image;
 }