| Index: src/gpu/text/GrAtlasTextBlob.h
|
| diff --git a/src/gpu/text/GrAtlasTextBlob.h b/src/gpu/text/GrAtlasTextBlob.h
|
| index 68cba3d50684de1fb02cdd4a839df0db7f5e6b1b..b4168e921ebf98ae691c7e991f850f8b06c805be 100644
|
| --- a/src/gpu/text/GrAtlasTextBlob.h
|
| +++ b/src/gpu/text/GrAtlasTextBlob.h
|
| @@ -200,6 +200,40 @@ public:
|
| const GrClip& clip,
|
| const SkIRect& clipBounds);
|
|
|
| + void computeSubRunBounds(SkRect* outBounds, int runIndex, int subRunIndex) {
|
| + // We don't yet position distance field text on the cpu, so we have to map the vertex bounds
|
| + // into device space.
|
| + // We handle vertex bounds differently for distance field text and bitmap text because
|
| + // the vertex bounds of bitmap text are in device space. If we are flushing multiple runs
|
| + // from one blob then we are going to pay the price here of mapping the rect for each run.
|
| + const Run& run = fRuns[runIndex];
|
| + const Run::SubRunInfo& subRun = run.fSubRunInfo[subRunIndex];
|
| + *outBounds = subRun.vertexBounds();
|
| + if (subRun.drawAsDistanceFields()) {
|
| + // Distance field text is positioned with the (X,Y) as part of the glyph position,
|
| + // and currently the view matrix is applied on the GPU
|
| + outBounds->offset(fX - fInitialX, fY - fInitialY);
|
| + fViewMatrix.mapRect(outBounds);
|
| + } else {
|
| + // Bitmap text is fully positioned on the CPU, and offset by an (X,Y) translate in
|
| + // device space.
|
| + SkMatrix boundsMatrix = fInitialViewMatrixInverse;
|
| +
|
| + boundsMatrix.postTranslate(-fInitialX, -fInitialY);
|
| +
|
| + boundsMatrix.postTranslate(fX, fY);
|
| +
|
| + boundsMatrix.postConcat(fViewMatrix);
|
| + boundsMatrix.mapRect(outBounds);
|
| +
|
| + // Due to floating point numerical inaccuracies, we have to round out here
|
| + outBounds->roundOut(outBounds);
|
| + }
|
| + }
|
| +
|
| + const SkMatrix& viewMatrix() const { return fViewMatrix; }
|
| +
|
| +
|
| // position + local coord
|
| static const size_t kColorTextVASize = sizeof(SkPoint) + sizeof(SkIPoint16);
|
| static const size_t kGrayTextVASize = sizeof(SkPoint) + sizeof(GrColor) + sizeof(SkIPoint16);
|
| @@ -221,12 +255,6 @@ public:
|
| this->setupViewMatrix(viewMatrix, x, y);
|
| }
|
|
|
| - GrDrawBatch* test_createBatch(int glyphCount, int run, int subRun,
|
| - GrColor color, SkScalar transX, SkScalar transY,
|
| - const SkPaint& skPaint, const SkSurfaceProps& props,
|
| - const GrDistanceFieldAdjustTable* distanceAdjustTable,
|
| - GrBatchFontCache* cache);
|
| -
|
| const Key& key() const { return fKey; }
|
|
|
| ~GrAtlasTextBlob() {
|
| @@ -235,6 +263,14 @@ public:
|
| }
|
| }
|
|
|
| + ////////////////////////////////////////////////////////////////////////////////////////////////
|
| + // Internal test methods
|
| + GrDrawBatch* test_createBatch(int glyphCount, int run, int subRun,
|
| + GrColor color, SkScalar transX, SkScalar transY,
|
| + const SkPaint& skPaint, const SkSurfaceProps& props,
|
| + const GrDistanceFieldAdjustTable* distanceAdjustTable,
|
| + GrBatchFontCache* cache);
|
| +
|
| private:
|
| GrAtlasTextBlob()
|
| : fMaxMinScale(-SK_ScalarMax)
|
|
|