Index: src/gpu/GrDistanceFieldTextContext.cpp |
diff --git a/src/gpu/GrDistanceFieldTextContext.cpp b/src/gpu/GrDistanceFieldTextContext.cpp |
index a052b641f63d1a085306baa90db005714351b426..a6cb285a707b043609329aadf93f521d87609109 100755 |
--- a/src/gpu/GrDistanceFieldTextContext.cpp |
+++ b/src/gpu/GrDistanceFieldTextContext.cpp |
@@ -79,7 +79,7 @@ GrDistanceFieldTextContext::~GrDistanceFieldTextContext() { |
SkSafeSetNull(fGammaTexture); |
} |
-bool GrDistanceFieldTextContext::canDraw(const SkPaint& paint) { |
+bool GrDistanceFieldTextContext::canDraw(const SkPaint& paint, const SkMatrix& viewMatrix) { |
if (!fEnableDFRendering && !paint.isDistanceFieldTextTEMP()) { |
return false; |
} |
@@ -98,7 +98,7 @@ bool GrDistanceFieldTextContext::canDraw(const SkPaint& paint) { |
// TODO: choose an appropriate maximum scale for distance fields and |
// enable perspective |
- if (SkDraw::ShouldDrawTextAsPaths(paint, fContext->getMatrix())) { |
+ if (SkDraw::ShouldDrawTextAsPaths(paint, viewMatrix)) { |
return false; |
} |
@@ -110,7 +110,7 @@ inline void GrDistanceFieldTextContext::init(const GrPaint& paint, const SkPaint |
fStrike = NULL; |
- const SkMatrix& ctm = fContext->getMatrix(); |
+ const SkMatrix& ctm = fViewMatrix; |
// getMaxScale doesn't support perspective, so neither do we at the moment |
SkASSERT(!ctm.hasPerspective()); |
@@ -200,8 +200,9 @@ static void setup_gamma_texture(GrContext* context, const SkGlyphCache* cache, |
} |
void GrDistanceFieldTextContext::onDrawText(const GrPaint& paint, const SkPaint& skPaint, |
- const char text[], size_t byteLength, |
- SkScalar x, SkScalar y) { |
+ const SkMatrix& viewMatrix, |
+ const char text[], size_t byteLength, |
+ SkScalar x, SkScalar y) { |
SkASSERT(byteLength == 0 || text != NULL); |
// nothing to draw |
@@ -209,6 +210,7 @@ void GrDistanceFieldTextContext::onDrawText(const GrPaint& paint, const SkPaint& |
return; |
} |
+ fViewMatrix = viewMatrix; |
SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc(); |
SkAutoGlyphCache autoCache(skPaint, &fDeviceProperties, NULL); |
SkGlyphCache* cache = autoCache.getCache(); |
@@ -258,13 +260,14 @@ void GrDistanceFieldTextContext::onDrawText(const GrPaint& paint, const SkPaint& |
y -= alignY; |
SkPoint offset = SkPoint::Make(x, y); |
- this->drawPosText(paint, skPaint, text, byteLength, positions.begin(), 2, offset); |
+ this->drawPosText(paint, skPaint, viewMatrix, text, byteLength, positions.begin(), 2, offset); |
} |
void GrDistanceFieldTextContext::onDrawPosText(const GrPaint& paint, const SkPaint& skPaint, |
- const char text[], size_t byteLength, |
- const SkScalar pos[], int scalarsPerPosition, |
- const SkPoint& offset) { |
+ const SkMatrix& viewMatrix, |
+ const char text[], size_t byteLength, |
+ const SkScalar pos[], int scalarsPerPosition, |
+ const SkPoint& offset) { |
SkASSERT(byteLength == 0 || text != NULL); |
SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); |
@@ -274,6 +277,7 @@ void GrDistanceFieldTextContext::onDrawPosText(const GrPaint& paint, const SkPai |
return; |
} |
+ fViewMatrix = viewMatrix; |
this->init(paint, skPaint); |
SkDrawCacheProc glyphCacheProc = fSkPaint.getDrawCacheProc(); |
@@ -349,8 +353,9 @@ void GrDistanceFieldTextContext::onDrawPosText(const GrPaint& paint, const SkPai |
this->finish(); |
if (fallbackTxt.count() > 0) { |
- fFallbackTextContext->drawPosText(paint, skPaint, fallbackTxt.begin(), fallbackTxt.count(), |
- fallbackPos.begin(), scalarsPerPosition, offset); |
+ fFallbackTextContext->drawPosText(paint, skPaint, viewMatrix, fallbackTxt.begin(), |
+ fallbackTxt.count(), fallbackPos.begin(), |
+ scalarsPerPosition, offset); |
} |
} |
@@ -388,7 +393,7 @@ void GrDistanceFieldTextContext::setupCoverageEffect(const SkColor& filteredColo |
GrTextureParams gammaParams(SkShader::kClamp_TileMode, GrTextureParams::kNone_FilterMode); |
uint32_t textureUniqueID = fCurrTexture->getUniqueID(); |
- const SkMatrix& ctm = fContext->getMatrix(); |
+ const SkMatrix& ctm = fViewMatrix; |
// set up any flags |
uint32_t flags = 0; |
@@ -517,7 +522,7 @@ bool GrDistanceFieldTextContext::appendGlyph(GrGlyph::PackedID packed, |
// check if we clipped out |
SkRect dstRect; |
- const SkMatrix& ctm = fContext->getMatrix(); |
+ const SkMatrix& ctm = fViewMatrix; |
(void) ctm.mapRect(&dstRect, glyphRect); |
if (fClipRect.quickReject(SkScalarTruncToInt(dstRect.left()), |
SkScalarTruncToInt(dstRect.top()), |
@@ -544,14 +549,16 @@ bool GrDistanceFieldTextContext::appendGlyph(GrGlyph::PackedID packed, |
// flush any accumulated draws before drawing this glyph as a path. |
this->flush(); |
- GrContext::AutoMatrix am; |
SkMatrix ctm; |
ctm.setScale(fTextRatio, fTextRatio); |
ctm.postTranslate(sx - dx, sy - dy); |
GrPaint tmpPaint(fPaint); |
- am.setPreConcat(fContext, ctm, &tmpPaint); |
+ tmpPaint.localCoordChange(ctm); |
+ |
+ SkMatrix viewM = fViewMatrix; |
+ viewM.preConcat(ctm); |
GrStrokeInfo strokeInfo(SkStrokeRec::kFill_InitStyle); |
- fContext->drawPath(tmpPaint, *glyph->fPath, strokeInfo); |
+ fContext->drawPath(tmpPaint, viewM, *glyph->fPath, strokeInfo); |
// remove this glyph from the vertices we need to allocate |
fTotalVertexCount -= kVerticesPerGlyph; |
@@ -625,7 +632,7 @@ void GrDistanceFieldTextContext::flush() { |
if (fCurrVertex > 0) { |
GrDrawState drawState; |
- drawState.setFromPaint(fPaint, fContext->getMatrix(), fContext->getRenderTarget()); |
+ drawState.setFromPaint(fPaint, fViewMatrix, fContext->getRenderTarget()); |
// setup our sampler state for our text texture/atlas |
SkASSERT(SkIsAlign4(fCurrVertex)); |