Index: src/gpu/GrTextContext.cpp |
diff --git a/src/gpu/GrTextContext.cpp b/src/gpu/GrTextContext.cpp |
index d4c01719b7da20817b02885db2ac031dcb1060b3..32187109f359ac92b3291fa3009bb1bfa3e64723 100644 |
--- a/src/gpu/GrTextContext.cpp |
+++ b/src/gpu/GrTextContext.cpp |
@@ -57,7 +57,7 @@ void GrTextContext::drawText(GrRenderTarget* rt, const GrClip& clip, const GrPai |
GrTextContext* textContext = this; |
do { |
- if (textContext->canDraw(skPaint, viewMatrix)) { |
+ if (textContext->canDraw(rt, clip, paint, skPaint, viewMatrix)) { |
textContext->onDrawText(rt, clip, paint, skPaint, viewMatrix, text, byteLength, x, y, |
clipBounds); |
return; |
@@ -80,7 +80,7 @@ void GrTextContext::drawPosText(GrRenderTarget* rt, const GrClip& clip, const Gr |
GrTextContext* textContext = this; |
do { |
- if (textContext->canDraw(skPaint, viewMatrix)) { |
+ if (textContext->canDraw(rt, clip, paint, skPaint, viewMatrix)) { |
textContext->onDrawPosText(rt, clip, paint, skPaint, viewMatrix, text, byteLength, pos, |
scalarsPerPosition, offset, clipBounds); |
return; |
@@ -97,19 +97,49 @@ void GrTextContext::drawTextBlob(GrRenderTarget* rt, const GrClip& clip, const S |
const SkMatrix& viewMatrix, const SkTextBlob* blob, |
SkScalar x, SkScalar y, |
SkDrawFilter* drawFilter, const SkIRect& clipBounds) { |
- if (!fContext->getTextTarget()) { |
- return; |
- } |
+ SkPaint runPaint = skPaint; |
- GrTextContext* textContext = this; |
- do { |
- if (textContext->canDraw(skPaint, viewMatrix)) { |
- textContext->onDrawTextBlob(rt, clip, skPaint, viewMatrix, blob, x, y, drawFilter, |
- clipBounds); |
- return; |
+ SkTextBlob::RunIterator it(blob); |
+ for (;!it.done(); it.next()) { |
+ size_t textLen = it.glyphCount() * sizeof(uint16_t); |
+ const SkPoint& offset = it.offset(); |
+ // applyFontToPaint() always overwrites the exact same attributes, |
+ // so it is safe to not re-seed the paint for this reason. |
+ it.applyFontToPaint(&runPaint); |
+ |
+ if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Type)) { |
+ // A false return from filter() means we should abort the current draw. |
+ runPaint = skPaint; |
+ continue; |
} |
- textContext = textContext->fFallbackTextContext; |
- } while (textContext); |
+ |
+ runPaint.setFlags(fGpuDevice->filterTextFlags(runPaint)); |
+ |
+ GrPaint grPaint; |
+ SkPaint2GrPaintShader(fContext, fRenderTarget, runPaint, viewMatrix, true, &grPaint); |
+ |
+ switch (it.positioning()) { |
+ case SkTextBlob::kDefault_Positioning: |
+ this->drawText(rt, clip, grPaint, runPaint, viewMatrix, (const char *)it.glyphs(), |
+ textLen, x + offset.x(), y + offset.y(), clipBounds); |
+ break; |
+ case SkTextBlob::kHorizontal_Positioning: |
+ this->drawPosText(rt, clip, grPaint, runPaint, viewMatrix, (const char*)it.glyphs(), |
+ textLen, it.pos(), 1, SkPoint::Make(x, y + offset.y()), clipBounds); |
+ break; |
+ case SkTextBlob::kFull_Positioning: |
+ this->drawPosText(rt, clip, grPaint, runPaint, viewMatrix, (const char*)it.glyphs(), |
+ textLen, it.pos(), 2, SkPoint::Make(x, y), clipBounds); |
+ break; |
+ default: |
+ SkFAIL("unhandled positioning mode"); |
+ } |
+ |
+ if (drawFilter) { |
+ // A draw filter may change the paint arbitrarily, so we must re-seed in this case. |
+ runPaint = skPaint; |
+ } |
+ } |
} |
void GrTextContext::drawTextAsPath(const SkPaint& skPaint, const SkMatrix& viewMatrix, |
@@ -180,55 +210,6 @@ void GrTextContext::drawPosTextAsPath(const SkPaint& origPaint, const SkMatrix& |
} |
} |
-void GrTextContext::onDrawTextBlob(GrRenderTarget* rt, const GrClip& clip, |
- const SkPaint& skPaint, const SkMatrix& viewMatrix, |
- const SkTextBlob* blob, SkScalar x, SkScalar y, |
- SkDrawFilter* drawFilter, const SkIRect& clipBounds) { |
- SkPaint runPaint = skPaint; |
- |
- SkTextBlob::RunIterator it(blob); |
- for (;!it.done(); it.next()) { |
- size_t textLen = it.glyphCount() * sizeof(uint16_t); |
- const SkPoint& offset = it.offset(); |
- // applyFontToPaint() always overwrites the exact same attributes, |
- // so it is safe to not re-seed the paint for this reason. |
- it.applyFontToPaint(&runPaint); |
- |
- if (drawFilter && !drawFilter->filter(&runPaint, SkDrawFilter::kText_Type)) { |
- // A false return from filter() means we should abort the current draw. |
- runPaint = skPaint; |
- continue; |
- } |
- |
- runPaint.setFlags(fGpuDevice->filterTextFlags(runPaint)); |
- |
- GrPaint grPaint; |
- SkPaint2GrPaintShader(fContext, fRenderTarget, runPaint, viewMatrix, true, &grPaint); |
- |
- switch (it.positioning()) { |
- case SkTextBlob::kDefault_Positioning: |
- this->drawText(rt, clip, grPaint, runPaint, viewMatrix, (const char *)it.glyphs(), |
- textLen, x + offset.x(), y + offset.y(), clipBounds); |
- break; |
- case SkTextBlob::kHorizontal_Positioning: |
- this->drawPosText(rt, clip, grPaint, runPaint, viewMatrix, (const char*)it.glyphs(), |
- textLen, it.pos(), 1, SkPoint::Make(x, y + offset.y()), clipBounds); |
- break; |
- case SkTextBlob::kFull_Positioning: |
- this->drawPosText(rt, clip, grPaint, runPaint, viewMatrix, (const char*)it.glyphs(), |
- textLen, it.pos(), 2, SkPoint::Make(x, y), clipBounds); |
- break; |
- default: |
- SkFAIL("unhandled positioning mode"); |
- } |
- |
- if (drawFilter) { |
- // A draw filter may change the paint arbitrarily, so we must re-seed in this case. |
- runPaint = skPaint; |
- } |
- } |
-} |
- |
//*** change to output positions? |
int GrTextContext::MeasureText(SkGlyphCache* cache, SkDrawCacheProc glyphCacheProc, |
const char text[], size_t byteLength, SkVector* stopVector) { |