Fixed xoom bug introduced in r5830

https://codereview.appspot.com/6604053/



git-svn-id: http://skia.googlecode.com/svn/trunk@5862 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp
index ae6d0f2..678a9c5 100644
--- a/src/gpu/GrInOrderDrawBuffer.cpp
+++ b/src/gpu/GrInOrderDrawBuffer.cpp
@@ -92,9 +92,34 @@
         bool appendToPreviousDraw = false;
         GrVertexLayout layout = GetRectVertexLayout(srcRects);
 
-        // When we batch rects we store the color at each vertex in order
-        // to allow batching when only the draw color is changing (the usual case)
-        layout |= kColor_VertexLayoutBit;
+        // Batching across colors means we move the draw color into the
+        // rect's vertex colors to allow greater batching (a lot of rects
+        // in a row differing only in color is a common occurence in tables).
+        bool batchAcrossColors = true;
+        if (!this->getCaps().dualSourceBlendingSupport()) {
+            for (int s = 0; s < GrDrawState::kNumStages; ++s) {
+                if (this->getDrawState().isStageEnabled(s)) {
+                    // We disable batching across colors when there is a texture 
+                    // present because (by pushing the the color to the vertices)
+                    // Ganesh loses track of the rect's opacity. This, in turn, can
+                    // cause some of the blending optimizations to be disabled. This
+                    // becomes a huge problem on some of the smaller devices where
+                    // shader derivatives and dual source blending aren't supported.
+                    // In those cases paths are often drawn to a texture and then
+                    // drawn as a texture (using this method). Because dual source
+                    // blending is disabled (and the blend optimizations are short
+                    // circuited) some of the more esoteric blend modes can no longer
+                    // be supported.
+                    // TODO: add tracking of batchAcrossColors's opacity
+                    batchAcrossColors = false;
+                    break;
+                }
+            }
+        }
+
+        if (batchAcrossColors) {
+            layout |= kColor_VertexLayoutBit;
+        }
 
         AutoReleaseGeometry geo(this, layout, 4, 0);
         if (!geo.succeeded()) {
@@ -129,7 +154,9 @@
         // Now that the paint's color is stored in the vertices set it to
         // white so that the following code can batch all the rects regardless
         // of paint color
-        GrDrawState::AutoColorRestore acr(this->drawState(), SK_ColorWHITE);
+        GrDrawState::AutoColorRestore acr(this->drawState(), 
+                                          batchAcrossColors ? SK_ColorWHITE
+                                                            : this->getDrawState().getColor());
 
         // we don't want to miss an opportunity to batch rects together
         // simply because the clip has changed if the clip doesn't affect