| Index: src/gpu/GrTextContext.cpp
|
| diff --git a/src/gpu/GrTextContext.cpp b/src/gpu/GrTextContext.cpp
|
| index b31c193258534b53e1a1ff1446186d19164db98d..557c2a91976a4d52677866626e971bfd9ab12d3e 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"
|
|
|
| @@ -89,6 +91,55 @@ 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) {
|
| + 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;
|
| + }
|
| + }
|
| +}
|
| +
|
| void GrTextContext::drawTextAsPath(const SkPaint& skPaint, const SkMatrix& viewMatrix,
|
| const char text[], size_t byteLength, SkScalar x, SkScalar y,
|
| const SkIRect& clipBounds) {
|
|
|