Draw textShadow always first.

Interleaving text and shadow rendering resulted in issuing draw commands from FontRenderer::renderDropShadow.

bug: 28528923
Change-Id: Ife2677f58180aaf10ec74d7c6efe5c44fe248daa
diff --git a/libs/hwui/BakedOpDispatcher.cpp b/libs/hwui/BakedOpDispatcher.cpp
index 0f670a8..e98c24e 100644
--- a/libs/hwui/BakedOpDispatcher.cpp
+++ b/libs/hwui/BakedOpDispatcher.cpp
@@ -194,8 +194,12 @@
     renderer.renderGlop(nullptr, clip, glop);
 }
 
-static void renderTextShadow(BakedOpRenderer& renderer, FontRenderer& fontRenderer,
+static void renderTextShadow(BakedOpRenderer& renderer,
         const TextOp& op, const BakedOpState& textOpState) {
+    if (CC_LIKELY(!PaintUtils::hasTextShadow(op.paint))) return;
+
+    FontRenderer& fontRenderer = renderer.caches().fontRenderer.getFontRenderer();
+    fontRenderer.setFont(op.paint, SkMatrix::I());
     renderer.caches().textureState().activateTexture(0);
 
     PaintUtils::TextShadow textShadow;
@@ -258,15 +262,9 @@
     Flush
 };
 
-static void renderTextOp(BakedOpRenderer& renderer, const TextOp& op, const BakedOpState& state,
+static void renderText(BakedOpRenderer& renderer, const TextOp& op, const BakedOpState& state,
         const ClipBase* renderClip, TextRenderType renderType) {
     FontRenderer& fontRenderer = renderer.caches().fontRenderer.getFontRenderer();
-
-    if (CC_UNLIKELY(PaintUtils::hasTextShadow(op.paint))) {
-        fontRenderer.setFont(op.paint, SkMatrix::I());
-        renderTextShadow(renderer, fontRenderer, op, state);
-    }
-
     float x = op.x;
     float y = op.y;
     const Matrix4& transform = state.computedState.transform;
@@ -321,6 +319,12 @@
 
 void BakedOpDispatcher::onMergedTextOps(BakedOpRenderer& renderer,
         const MergedBakedOpList& opList) {
+    for (size_t i = 0; i < opList.count; i++) {
+        const BakedOpState& state = *(opList.states[i]);
+        const TextOp& op = *(static_cast<const TextOp*>(state.op));
+        renderTextShadow(renderer, op, state);
+    }
+
     ClipRect renderTargetClip(opList.clip);
     const ClipBase* clip = opList.clipSideFlags ? &renderTargetClip : nullptr;
     for (size_t i = 0; i < opList.count; i++) {
@@ -328,7 +332,7 @@
         const TextOp& op = *(static_cast<const TextOp*>(state.op));
         TextRenderType renderType = (i + 1 == opList.count)
                 ? TextRenderType::Flush : TextRenderType::Defer;
-        renderTextOp(renderer, op, state, clip, renderType);
+        renderText(renderer, op, state, clip, renderType);
     }
 }
 
@@ -739,7 +743,8 @@
 }
 
 void BakedOpDispatcher::onTextOp(BakedOpRenderer& renderer, const TextOp& op, const BakedOpState& state) {
-    renderTextOp(renderer, op, state, state.computedState.getClipIfNeeded(), TextRenderType::Flush);
+    renderTextShadow(renderer, op, state);
+    renderText(renderer, op, state, state.computedState.getClipIfNeeded(), TextRenderType::Flush);
 }
 
 void BakedOpDispatcher::onTextOnPathOp(BakedOpRenderer& renderer, const TextOnPathOp& op, const BakedOpState& state) {