A change to cleanup some organization around df text
authorjoshualitt <joshualitt@chromium.org>
Fri, 11 Dec 2015 19:05:43 +0000 (11:05 -0800)
committerCommit bot <commit-bot@chromium.org>
Fri, 11 Dec 2015 19:05:43 +0000 (11:05 -0800)
BUG=skia:

Review URL: https://codereview.chromium.org/1519083002

src/gpu/text/GrAtlasTextContext.cpp
src/gpu/text/GrAtlasTextContext.h

index aca839c..3769b0b 100644 (file)
@@ -291,41 +291,32 @@ void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob,
             PerSubRunInfo& subRun = runIdx.fSubRunInfo.back();
             subRun.setUseLCDText(runPaint.isLCDRenderText());
             subRun.setDrawAsDistanceFields();
+            SkGlyphCache* cache = this->setupCache(&cacheBlob->fRuns[run], dfPaint, nullptr, true);
 
-            SkTDArray<char> fallbackTxt;
-            SkTDArray<SkScalar> fallbackPos;
-            SkPoint dfOffset;
-            int scalarsPerPosition = 2;
             switch (it.positioning()) {
                 case SkTextBlob::kDefault_Positioning: {
-                    this->internalDrawDFText(cacheBlob, run, dfPaint, color, viewMatrix,
+                    this->internalDrawDFText(cacheBlob, run, cache, dfPaint, color, viewMatrix,
                                              (const char *)it.glyphs(), textLen,
-                                             x + offset.x(), y + offset.y(), textRatio,
-                                             &fallbackTxt, &fallbackPos, &dfOffset, runPaint);
+                                             x + offset.x(), y + offset.y(), textRatio, runPaint);
                     break;
                 }
                 case SkTextBlob::kHorizontal_Positioning: {
-                    scalarsPerPosition = 1;
-                    dfOffset = SkPoint::Make(x, y + offset.y());
-                    this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix,
+                    SkPoint dfOffset = SkPoint::Make(x, y + offset.y());
+                    this->internalDrawDFPosText(cacheBlob, run, cache, dfPaint, color, viewMatrix,
                                                 (const char*)it.glyphs(), textLen, it.pos(),
-                                                scalarsPerPosition, dfOffset, textRatio,
-                                                &fallbackTxt, &fallbackPos);
+                                                1, dfOffset, textRatio,
+                                                runPaint);
                     break;
                 }
                 case SkTextBlob::kFull_Positioning: {
-                    dfOffset = SkPoint::Make(x, y);
-                    this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix,
+                    SkPoint dfOffset = SkPoint::Make(x, y);
+                    this->internalDrawDFPosText(cacheBlob, run, cache, dfPaint, color, viewMatrix,
                                                 (const char*)it.glyphs(), textLen, it.pos(),
-                                                scalarsPerPosition, dfOffset, textRatio,
-                                                &fallbackTxt, &fallbackPos);
+                                                2, dfOffset, textRatio, runPaint);
                     break;
                 }
             }
-            if (fallbackTxt.count()) {
-                this->fallbackDrawPosText(cacheBlob, run, clip, color, runPaint, viewMatrix,
-                                          fallbackTxt, fallbackPos, scalarsPerPosition, dfOffset);
-            }
+            SkGlyphCache::AttachCache(cache);
         } else if (SkDraw::ShouldDrawTextAsPaths(runPaint, viewMatrix)) {
             cacheBlob->fRuns[run].fDrawAsPaths = true;
         } else {
@@ -418,7 +409,6 @@ inline void GrAtlasTextContext::initDistanceFieldPaint(GrAtlasTextBlob* blob,
 
 inline void GrAtlasTextContext::fallbackDrawPosText(GrAtlasTextBlob* blob,
                                                     int runIndex,
-                                                    const GrClip& clip,
                                                     GrColor color,
                                                     const SkPaint& skPaint,
                                                     const SkMatrix& viewMatrix,
@@ -460,11 +450,10 @@ GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint,
 }
 
 inline GrAtlasTextBlob*
-GrAtlasTextContext::createDrawTextBlob(const GrClip& clip,
-                                       const GrPaint& paint, const SkPaint& skPaint,
+GrAtlasTextContext::createDrawTextBlob(const GrPaint& paint, const SkPaint& skPaint,
                                        const SkMatrix& viewMatrix,
                                        const char text[], size_t byteLength,
-                                       SkScalar x, SkScalar y, const SkIRect& regionClipBounds) {
+                                       SkScalar x, SkScalar y) {
     int glyphCount = skPaint.countText(text, byteLength);
 
     GrAtlasTextBlob* blob;
@@ -472,17 +461,11 @@ GrAtlasTextContext::createDrawTextBlob(const GrClip& clip,
         SkPaint dfPaint;
         SkScalar textRatio;
         blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &textRatio);
+        SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], dfPaint, nullptr, true);
 
-        SkTDArray<char> fallbackTxt;
-        SkTDArray<SkScalar> fallbackPos;
-        SkPoint offset;
-        this->internalDrawDFText(blob, 0, dfPaint, paint.getColor(), viewMatrix, text,
-                                 byteLength, x, y, textRatio, &fallbackTxt, &fallbackPos,
-                                 &offset, skPaint);
-        if (fallbackTxt.count()) {
-            this->fallbackDrawPosText(blob, 0, clip, paint.getColor(), skPaint, viewMatrix,
-                                      fallbackTxt, fallbackPos, 2, offset);
-        }
+        this->internalDrawDFText(blob, 0, cache, dfPaint, paint.getColor(), viewMatrix, text,
+                                 byteLength, x, y, textRatio, skPaint);
+        SkGlyphCache::AttachCache(cache);
     } else {
         blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASize);
         blob->fViewMatrix = viewMatrix;
@@ -496,12 +479,11 @@ GrAtlasTextContext::createDrawTextBlob(const GrClip& clip,
 }
 
 inline GrAtlasTextBlob*
-GrAtlasTextContext::createDrawPosTextBlob(const GrClip& clip,
-                                          const GrPaint& paint, const SkPaint& skPaint,
+GrAtlasTextContext::createDrawPosTextBlob(const GrPaint& paint, const SkPaint& skPaint,
                                           const SkMatrix& viewMatrix,
                                           const char text[], size_t byteLength,
                                           const SkScalar pos[], int scalarsPerPosition,
-                                          const SkPoint& offset, const SkIRect& regionClipBounds) {
+                                          const SkPoint& offset) {
     int glyphCount = skPaint.countText(text, byteLength);
 
     GrAtlasTextBlob* blob;
@@ -509,16 +491,12 @@ GrAtlasTextContext::createDrawPosTextBlob(const GrClip& clip,
         SkPaint dfPaint;
         SkScalar textRatio;
         blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &textRatio);
+        SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], dfPaint, nullptr, true);
 
-        SkTDArray<char> fallbackTxt;
-        SkTDArray<SkScalar> fallbackPos;
-        this->internalDrawDFPosText(blob, 0, dfPaint, paint.getColor(), viewMatrix, text,
-                                    byteLength, pos, scalarsPerPosition, offset,
-                                    textRatio, &fallbackTxt, &fallbackPos);
-        if (fallbackTxt.count()) {
-            this->fallbackDrawPosText(blob, 0, clip, paint.getColor(), skPaint, viewMatrix,
-                                      fallbackTxt, fallbackPos, scalarsPerPosition, offset);
-        }
+        this->internalDrawDFPosText(blob, 0, cache, dfPaint, paint.getColor(), viewMatrix, text,
+                                    byteLength, pos, scalarsPerPosition, offset, textRatio,
+                                    skPaint);
+        SkGlyphCache::AttachCache(cache);
     } else {
         blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASize);
         blob->fViewMatrix = viewMatrix;
@@ -538,8 +516,7 @@ void GrAtlasTextContext::onDrawText(GrDrawContext* dc,
                                     const char text[], size_t byteLength,
                                     SkScalar x, SkScalar y, const SkIRect& regionClipBounds) {
     SkAutoTUnref<GrAtlasTextBlob> blob(
-        this->createDrawTextBlob(clip, paint, skPaint, viewMatrix,
-                                 text, byteLength, x, y, regionClipBounds));
+        this->createDrawTextBlob(paint, skPaint, viewMatrix, text, byteLength, x, y));
     blob->flushThrowaway(fContext, dc, fSurfaceProps, fDistanceAdjustTable, skPaint, paint,
                          clip, regionClipBounds);
 }
@@ -552,24 +529,22 @@ void GrAtlasTextContext::onDrawPosText(GrDrawContext* dc,
                                        const SkScalar pos[], int scalarsPerPosition,
                                        const SkPoint& offset, const SkIRect& regionClipBounds) {
     SkAutoTUnref<GrAtlasTextBlob> blob(
-        this->createDrawPosTextBlob(clip, paint, skPaint, viewMatrix,
+        this->createDrawPosTextBlob(paint, skPaint, viewMatrix,
                                     text, byteLength,
                                     pos, scalarsPerPosition,
-                                    offset, regionClipBounds));
+                                    offset));
 
     blob->flushThrowaway(fContext, dc, fSurfaceProps, fDistanceAdjustTable, skPaint, paint, clip,
                          regionClipBounds);
 }
 
 void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex,
+                                            SkGlyphCache* cache,
                                             const SkPaint& skPaint, GrColor color,
                                             const SkMatrix& viewMatrix,
                                             const char text[], size_t byteLength,
                                             SkScalar x, SkScalar y,
                                             SkScalar textRatio,
-                                            SkTDArray<char>* fallbackTxt,
-                                            SkTDArray<SkScalar>* fallbackPos,
-                                            SkPoint* offset,
                                             const SkPaint& origPaint) {
     SkASSERT(byteLength == 0 || text != nullptr);
 
@@ -628,22 +603,22 @@ void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex,
     }
     x -= alignX;
     y -= alignY;
-    *offset = SkPoint::Make(x, y);
+    SkPoint offset = SkPoint::Make(x, y);
 
-    this->internalDrawDFPosText(blob, runIndex, skPaint, color, viewMatrix, text, byteLength,
-                                positions.begin(), 2, *offset, textRatio, fallbackTxt,
-                                fallbackPos);
+    this->internalDrawDFPosText(blob, runIndex, cache, skPaint, color, viewMatrix, text, byteLength,
+                                positions.begin(), 2, offset, textRatio, origPaint);
 }
 
 void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runIndex,
-                                               const SkPaint& skPaint, GrColor color,
+                                               SkGlyphCache* cache,
+                                               const SkPaint& skPaint,
+                                               GrColor color,
                                                const SkMatrix& viewMatrix,
                                                const char text[], size_t byteLength,
                                                const SkScalar pos[], int scalarsPerPosition,
                                                const SkPoint& offset,
                                                SkScalar textRatio,
-                                               SkTDArray<char>* fallbackTxt,
-                                               SkTDArray<SkScalar>* fallbackPos) {
+                                               const SkPaint& origPaint) {
 
     SkASSERT(byteLength == 0 || text != nullptr);
     SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition);
@@ -653,10 +628,12 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd
         return;
     }
 
+    SkTDArray<char> fallbackTxt;
+    SkTDArray<SkScalar> fallbackPos;
+
     fCurrStrike = nullptr;
 
     SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc();
-    SkGlyphCache* cache = this->setupCache(&blob->fRuns[runIndex], skPaint, nullptr, true);
     GrFontScaler* fontScaler = GetGrFontScaler(cache);
 
     const char* stop = text + byteLength;
@@ -677,10 +654,10 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd
                                          x, y, color, fontScaler,
                                          textRatio, viewMatrix)) {
                     // couldn't append, send to fallback
-                    fallbackTxt->append(SkToInt(text-lastText), lastText);
-                    *fallbackPos->append() = pos[0];
+                    fallbackTxt.append(SkToInt(text-lastText), lastText);
+                    *fallbackPos.append() = pos[0];
                     if (2 == scalarsPerPosition) {
-                        *fallbackPos->append() = pos[1];
+                        *fallbackPos.append() = pos[1];
                     }
                 }
             }
@@ -709,10 +686,10 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd
                                          textRatio,
                                          viewMatrix)) {
                     // couldn't append, send to fallback
-                    fallbackTxt->append(SkToInt(text-lastText), lastText);
-                    *fallbackPos->append() = pos[0];
+                    fallbackTxt.append(SkToInt(text-lastText), lastText);
+                    *fallbackPos.append() = pos[0];
                     if (2 == scalarsPerPosition) {
-                        *fallbackPos->append() = pos[1];
+                        *fallbackPos.append() = pos[1];
                     }
                 }
             }
@@ -720,7 +697,10 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd
         }
     }
 
-    SkGlyphCache::AttachCache(cache);
+    if (fallbackTxt.count()) {
+        this->fallbackDrawPosText(blob, runIndex, origPaint.getColor(), origPaint, viewMatrix,
+                                  fallbackTxt, fallbackPos, scalarsPerPosition, offset);
+    }
 }
 
 bool GrAtlasTextContext::dfAppendGlyph(GrAtlasTextBlob* blob, int runIndex,
@@ -803,13 +783,12 @@ DRAW_BATCH_TEST_DEFINE(TextBlobBatch) {
 
     // Setup clip
     GrClip clip;
-    SkIRect noClip = SkIRect::MakeLargest();
 
     // right now we don't handle textblobs, nor do we handle drawPosText.  Since we only
     // intend to test the batch with this unit test, that is okay.
     SkAutoTUnref<GrAtlasTextBlob> blob(
-            gTextContext->createDrawTextBlob(clip, grPaint, skPaint, viewMatrix, text,
-                                             static_cast<size_t>(textLen), 0, 0, noClip));
+            gTextContext->createDrawTextBlob(grPaint, skPaint, viewMatrix, text,
+                                             static_cast<size_t>(textLen), 0, 0));
 
     SkScalar transX = static_cast<SkScalar>(random->nextU());
     SkScalar transY = static_cast<SkScalar>(random->nextU());
index 47f0540..e38243d 100644 (file)
@@ -66,29 +66,27 @@ private:
 
     // A helper for drawing BitmapText in a run of distance fields
     inline void fallbackDrawPosText(GrAtlasTextBlob*, int runIndex,
-                                    const GrClip&, GrColor color,
+                                    GrColor color,
                                     const SkPaint&, const SkMatrix& viewMatrix,
                                     const SkTDArray<char>& fallbackTxt,
                                     const SkTDArray<SkScalar>& fallbackPos,
                                     int scalarsPerPosition,
                                     const SkPoint& offset);
 
-    void internalDrawDFText(GrAtlasTextBlob*, int runIndex, const SkPaint&,
+    void internalDrawDFText(GrAtlasTextBlob*, int runIndex,
+                            SkGlyphCache*, const SkPaint&,
                             GrColor color, const SkMatrix& viewMatrix,
                             const char text[], size_t byteLength,
                             SkScalar x, SkScalar y,
-                            SkScalar textRatio,
-                            SkTDArray<char>* fallbackTxt,
-                            SkTDArray<SkScalar>* fallbackPos,
-                            SkPoint* offset, const SkPaint& origPaint);
-    void internalDrawDFPosText(GrAtlasTextBlob*, int runIndex, const SkPaint&,
+                            SkScalar textRatio, const SkPaint& origPaint);
+    void internalDrawDFPosText(GrAtlasTextBlob*, int runIndex,
+                               SkGlyphCache*, const SkPaint&,
                                GrColor color, const SkMatrix& viewMatrix,
                                const char text[], size_t byteLength,
                                const SkScalar pos[], int scalarsPerPosition,
                                const SkPoint& offset,
                                SkScalar textRatio,
-                               SkTDArray<char>* fallbackTxt,
-                               SkTDArray<SkScalar>* fallbackPos);
+                               const SkPaint& origPaint);
 
     // sets up the descriptor on the blob and returns a detached cache.  Client must attach
     inline static GrColor ComputeCanonicalColor(const SkPaint&, bool lcd);
@@ -104,17 +102,15 @@ private:
 
     // Test methods
     // TODO this is really ugly.  It'd be much nicer if positioning could be moved to batch
-    inline GrAtlasTextBlob* createDrawTextBlob(const GrClip&, const GrPaint&,
+    inline GrAtlasTextBlob* createDrawTextBlob(const GrPaint&,
                                                const SkPaint&, const SkMatrix& viewMatrix,
                                                const char text[], size_t byteLength,
-                                               SkScalar x, SkScalar y,
-                                               const SkIRect& regionClipBounds);
-    inline GrAtlasTextBlob* createDrawPosTextBlob(const GrClip&, const GrPaint&,
+                                               SkScalar x, SkScalar y);
+    inline GrAtlasTextBlob* createDrawPosTextBlob(const GrPaint&,
                                                   const SkPaint&, const SkMatrix& viewMatrix,
                                                   const char text[], size_t byteLength,
                                                   const SkScalar pos[], int scalarsPerPosition,
-                                                  const SkPoint& offset,
-                                                  const SkIRect& regionClipBounds);
+                                                  const SkPoint& offset);
     const GrDistanceFieldAdjustTable* dfAdjustTable() const { return fDistanceAdjustTable; }
 
     GrBatchTextStrike* fCurrStrike;