| 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) {
|
|
|