Simplify the atlas update inner loop

Try to move calculations out of the main atlas update loop.

Simplify expressions involving the result values. Invert the if-statement
and for-loop to do even less work.

Change-Id: Ibef88e65fb5bb8eeeaec13f0ae0ba1acb4d2d87d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/262926
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Herb Derby <herb@google.com>
diff --git a/src/gpu/text/GrTextBlob.cpp b/src/gpu/text/GrTextBlob.cpp
index ea6dfc4..4fb749a 100644
--- a/src/gpu/text/GrTextBlob.cpp
+++ b/src/gpu/text/GrTextBlob.cpp
@@ -904,24 +904,19 @@
         }
     }
 
-    GrTextStrike* grStrike = fSubRun->strike();
-    auto vertexStride = fSubRun->vertexStride();
-    char* currVertex = fSubRun->fVertexData.data() + fCurrGlyph * kVerticesPerGlyph * vertexStride;
-    result->fFirstVertex = currVertex;
-    int glyphLimit = (int)fSubRun->fGlyphs.size();
-    if (glyphLimit > fCurrGlyph + maxGlyphs) {
-        glyphLimit = fCurrGlyph + maxGlyphs;
-        result->fFinished = false;
-    }
+    int glyphLimit = std::min((int)fSubRun->fGlyphs.size(), fCurrGlyph + maxGlyphs);
 
     // If we reach here with fCurrGlyph > 0, some earlier call to regenerate() exhausted the atlas
     // before it could place all its glyphs and returned kTryAgain.  We'll use brokenRun below to
     // invalidate texture coordinates, forcing them to be regenerated, minding the atlas
     // flush between.
     const bool brokenRun = fCurrGlyph > 0;
+
     auto code = GrDrawOpAtlas::ErrorCode::kSucceeded;
-    for (; fCurrGlyph < glyphLimit; fCurrGlyph++) {
-        if (fActions.regenTextureCoordinates) {
+    int startingGlyph = fCurrGlyph;
+    if (fActions.regenTextureCoordinates) {
+        GrTextStrike* grStrike = fSubRun->strike();
+        for (; fCurrGlyph < glyphLimit; fCurrGlyph++) {
             GrGlyph* glyph = fSubRun->fGlyphs[fCurrGlyph];
             SkASSERT(glyph && glyph->fMaskFormat == fSubRun->maskFormat());
 
@@ -934,25 +929,24 @@
                 }
             }
             auto tokenTracker = fUploadTarget->tokenTracker();
-            fFullAtlasManager->addGlyphToBulkAndSetUseToken(fSubRun->bulkUseToken(), glyph,
-                                                            tokenTracker->nextDrawToken());
-        }
-
-        if (fActions.regenTextureCoordinates) {
+            fFullAtlasManager->addGlyphToBulkAndSetUseToken(
+                    fSubRun->bulkUseToken(), glyph, tokenTracker->nextDrawToken());
             fSubRun->updateTexCoord(fCurrGlyph);
         }
-
-        currVertex += vertexStride * GrAtlasTextOp::kVerticesPerGlyph;
-        ++result->fGlyphsRegenerated;
+    } else {
+        fCurrGlyph = glyphLimit;
     }
 
+    result->fFinished = fCurrGlyph == (int)fSubRun->fGlyphs.size();
+    result->fGlyphsRegenerated += fCurrGlyph - startingGlyph;
+    result->fFirstVertex = fSubRun->quadStart(startingGlyph);
+
     switch (code) {
         case GrDrawOpAtlas::ErrorCode::kError: {
             // Something horrible has happened - drop the op
             return false;
         }
         case GrDrawOpAtlas::ErrorCode::kTryAgain: {
-            result->fFinished = false;
             return true;
         }
         case GrDrawOpAtlas::ErrorCode::kSucceeded: {