Index: src/gpu/GrTextContext.cpp |
diff --git a/src/gpu/GrTextContext.cpp b/src/gpu/GrTextContext.cpp |
index 28e10e398c1d0d6b978a241e6050ae7293e15dca..d4c01719b7da20817b02885db2ac031dcb1060b3 100644 |
--- a/src/gpu/GrTextContext.cpp |
+++ b/src/gpu/GrTextContext.cpp |
@@ -11,9 +11,11 @@ |
#include "GrFontScaler.h" |
#include "SkAutoKern.h" |
+#include "SkDrawFilter.h" |
#include "SkDrawProcs.h" |
#include "SkGlyphCache.h" |
#include "SkGpuDevice.h" |
+#include "SkTextBlob.h" |
#include "SkTextMapStateProc.h" |
#include "SkTextToPathIter.h" |
@@ -91,6 +93,25 @@ void GrTextContext::drawPosText(GrRenderTarget* rt, const GrClip& clip, const Gr |
clipBounds); |
} |
+void GrTextContext::drawTextBlob(GrRenderTarget* rt, const GrClip& clip, const SkPaint& skPaint, |
+ const SkMatrix& viewMatrix, const SkTextBlob* blob, |
+ SkScalar x, SkScalar y, |
+ SkDrawFilter* drawFilter, const SkIRect& clipBounds) { |
+ if (!fContext->getTextTarget()) { |
+ return; |
+ } |
+ |
+ GrTextContext* textContext = this; |
+ do { |
+ if (textContext->canDraw(skPaint, viewMatrix)) { |
+ textContext->onDrawTextBlob(rt, clip, skPaint, viewMatrix, blob, x, y, drawFilter, |
+ clipBounds); |
+ return; |
+ } |
+ textContext = textContext->fFallbackTextContext; |
+ } while (textContext); |
+} |
+ |
void GrTextContext::drawTextAsPath(const SkPaint& skPaint, const SkMatrix& viewMatrix, |
const char text[], size_t byteLength, SkScalar x, SkScalar y, |
const SkIRect& clipBounds) { |
@@ -159,6 +180,55 @@ 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) { |