From bc81111f246ce2d5fbb61d7a347c9d890f6c8359 Mon Sep 17 00:00:00 2001 From: joshualitt Date: Thu, 11 Feb 2016 12:42:02 -0800 Subject: [PATCH] start to chip away at friending of GrAtlasTextBatch/GrAtlasTextBlob BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1684253002 Review URL: https://codereview.chromium.org/1684253002 --- src/gpu/batches/GrAtlasTextBatch.cpp | 1 - src/gpu/batches/GrAtlasTextBatch.h | 34 ++------------------ src/gpu/text/GrAtlasTextBlob.h | 48 ++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 39 deletions(-) diff --git a/src/gpu/batches/GrAtlasTextBatch.cpp b/src/gpu/batches/GrAtlasTextBatch.cpp index b2251a42a8..6a172df5a6 100644 --- a/src/gpu/batches/GrAtlasTextBatch.cpp +++ b/src/gpu/batches/GrAtlasTextBatch.cpp @@ -147,7 +147,6 @@ inline void GrAtlasTextBatch::regenBlob(Target* target, FlushInfo* flushInfo, Bl *desc = newDesc; *cache = SkGlyphCache::DetachCache(run->fTypeface, *desc); *scaler = GrTextContext::GetGrFontScaler(*cache); - strike = info->strike(); *typeface = run->fTypeface; } diff --git a/src/gpu/batches/GrAtlasTextBatch.h b/src/gpu/batches/GrAtlasTextBatch.h index f4008c9471..05d6afdb51 100644 --- a/src/gpu/batches/GrAtlasTextBatch.h +++ b/src/gpu/batches/GrAtlasTextBatch.h @@ -81,39 +81,9 @@ public: void init() { const Geometry& geo = fGeoData[0]; fBatch.fColor = geo.fColor; - fBatch.fViewMatrix = geo.fBlob->fViewMatrix; + fBatch.fViewMatrix = geo.fBlob->viewMatrix(); - // 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 = geo.fBlob->fRuns[geo.fRun]; - SkRect bounds = run.fSubRunInfo[geo.fSubRun].vertexBounds(); - if (run.fSubRunInfo[geo.fSubRun].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 - bounds.offset(geo.fBlob->fX - geo.fBlob->fInitialX, - geo.fBlob->fY - geo.fBlob->fInitialY); - fBatch.fViewMatrix.mapRect(&bounds); - this->setBounds(bounds); - } else { - // Bitmap text is fully positioned on the CPU, and offset by an (X,Y) translate in - // device space. - SkMatrix boundsMatrix = geo.fBlob->fInitialViewMatrixInverse; - - boundsMatrix.postTranslate(-geo.fBlob->fInitialX, -geo.fBlob->fInitialY); - - boundsMatrix.postTranslate(geo.fBlob->fX, geo.fBlob->fY); - - boundsMatrix.postConcat(geo.fBlob->fViewMatrix); - boundsMatrix.mapRect(&bounds); - - // Due to floating point numerical inaccuracies, we have to round out here - SkRect roundedOutBounds; - bounds.roundOut(&roundedOutBounds); - this->setBounds(roundedOutBounds); - } + geo.fBlob->computeSubRunBounds(&fBounds, geo.fRun, geo.fSubRun); } const char* name() const override { return "TextBatch"; } diff --git a/src/gpu/text/GrAtlasTextBlob.h b/src/gpu/text/GrAtlasTextBlob.h index 68cba3d506..b4168e921e 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)