Index: src/gpu/text/GrAtlasTextBlob.h |
diff --git a/src/gpu/text/GrAtlasTextBlob.h b/src/gpu/text/GrAtlasTextBlob.h |
index 1c5ea5e60ea73d6e8253794e46813d4f922665c8..af6441e003384246a772b493433f21086dc01b67 100644 |
--- a/src/gpu/text/GrAtlasTextBlob.h |
+++ b/src/gpu/text/GrAtlasTextBlob.h |
@@ -210,13 +210,11 @@ public: |
// We use this color vs the SkPaint color because it has the colorfilter applied. |
void initReusableBlob(GrColor color, const SkMatrix& viewMatrix, SkScalar x, SkScalar y) { |
fPaintColor = color; |
- fViewMatrix = viewMatrix; |
- fX = x; |
- fY = y; |
+ this->setupViewMatrix(viewMatrix, x, y); |
} |
- void initThrowawayBlob(const SkMatrix& viewMatrix) { |
- fViewMatrix = viewMatrix; |
+ void initThrowawayBlob(const SkMatrix& viewMatrix, SkScalar x, SkScalar y) { |
+ this->setupViewMatrix(viewMatrix, x, y); |
} |
GrDrawBatch* test_createBatch(int glyphCount, int run, int subRun, |
@@ -249,6 +247,20 @@ private: |
SkDrawFilter* drawFilter, const SkMatrix& viewMatrix, |
const SkIRect& clipBounds, SkScalar x, SkScalar y); |
+ // This function will only be called when we are regenerating a blob from scratch. We record the |
+ // initial view matrix and initial offsets(x,y), because we record vertex bounds relative to |
+ // these numbers. When blobs are reused with new matrices, we need to return to model space so |
+ // we can update the vertex bounds appropriately. |
+ void setupViewMatrix(const SkMatrix& viewMatrix, SkScalar x, SkScalar y) { |
+ fViewMatrix = viewMatrix; |
+ if (!viewMatrix.invert(&fInitialViewMatrixInverse)) { |
+ fInitialViewMatrixInverse = SkMatrix::I(); |
+ SkDebugf("Could not invert viewmatrix\n"); |
+ } |
+ fX = fInitialX = x; |
+ fY = fInitialY = y; |
+ } |
+ |
/* |
* Each Run inside of the blob can have its texture coordinates regenerated if required. |
* To determine if regeneration is necessary, fAtlasGeneration is used. If there have been |
@@ -276,7 +288,6 @@ private: |
Run() |
: fInitialized(false) |
, fDrawAsPaths(false) { |
- fVertexBounds.setLargestInverted(); |
// To ensure we always have one subrun, we push back a fresh run here |
fSubRunInfo.push_back(); |
} |
@@ -290,10 +301,13 @@ private: |
, fColor(GrColor_ILLEGAL) |
, fMaskFormat(kA8_GrMaskFormat) |
, fDrawAsDistanceFields(false) |
- , fUseLCDText(false) {} |
+ , fUseLCDText(false) { |
+ fVertexBounds.setLargestInverted(); |
+ } |
SubRunInfo(const SubRunInfo& that) |
: fBulkUseToken(that.fBulkUseToken) |
, fStrike(SkSafeRef(that.fStrike.get())) |
+ , fVertexBounds(that.fVertexBounds) |
, fAtlasGeneration(that.fAtlasGeneration) |
, fVertexStartIndex(that.fVertexStartIndex) |
, fVertexEndIndex(that.fVertexEndIndex) |
@@ -338,6 +352,11 @@ private: |
fVertexEndIndex = prev.vertexEndIndex(); |
} |
+ const SkRect& vertexBounds() const { return fVertexBounds; } |
+ void joinGlyphBounds(const SkRect& glyphBounds) { |
+ fVertexBounds.joinNonEmptyArg(glyphBounds); |
+ } |
+ |
// df properties |
void setUseLCDText(bool useLCDText) { fUseLCDText = useLCDText; } |
bool hasUseLCDText() const { return fUseLCDText; } |
@@ -347,6 +366,7 @@ private: |
private: |
GrBatchAtlas::BulkUseTokenUpdater fBulkUseToken; |
SkAutoTUnref<GrBatchTextStrike> fStrike; |
+ SkRect fVertexBounds; |
uint64_t fAtlasGeneration; |
size_t fVertexStartIndex; |
size_t fVertexEndIndex; |
@@ -368,7 +388,6 @@ private: |
} |
static const int kMinSubRuns = 1; |
SkAutoTUnref<SkTypeface> fTypeface; |
- SkRect fVertexBounds; |
SkSTArray<kMinSubRuns, SubRunInfo> fSubRunInfo; |
SkAutoDescriptor fDescriptor; |
@@ -423,7 +442,10 @@ private: |
SkTArray<BigGlyph> fBigGlyphs; |
Key fKey; |
SkMatrix fViewMatrix; |
+ SkMatrix fInitialViewMatrixInverse; |
GrColor fPaintColor; |
+ SkScalar fInitialX; |
+ SkScalar fInitialY; |
SkScalar fX; |
SkScalar fY; |