| Index: src/gpu/GrTextUtils.cpp
|
| diff --git a/src/gpu/GrTextUtils.cpp b/src/gpu/GrTextUtils.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e56b5cb29e07c6901963cf5a141fe903b1c9b904
|
| --- /dev/null
|
| +++ b/src/gpu/GrTextUtils.cpp
|
| @@ -0,0 +1,94 @@
|
| +/*
|
| + * Copyright 2015 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "GrTextUtils.h"
|
| +
|
| +#include "GrBlurUtils.h"
|
| +#include "GrContext.h"
|
| +#include "GrDrawContext.h"
|
| +#include "SkDrawProcs.h"
|
| +#include "SkGlyphCache.h"
|
| +#include "SkPaint.h"
|
| +#include "SkRect.h"
|
| +#include "SkTextMapStateProc.h"
|
| +#include "SkTextToPathIter.h"
|
| +
|
| +void GrTextUtils::DrawTextAsPath(GrContext* context, GrDrawContext* dc,
|
| + const GrClip& clip,
|
| + const SkPaint& skPaint, const SkMatrix& viewMatrix,
|
| + const char text[], size_t byteLength, SkScalar x, SkScalar y,
|
| + const SkIRect& clipBounds) {
|
| + SkTextToPathIter iter(text, byteLength, skPaint, true);
|
| +
|
| + SkMatrix matrix;
|
| + matrix.setScale(iter.getPathScale(), iter.getPathScale());
|
| + matrix.postTranslate(x, y);
|
| +
|
| + const SkPath* iterPath;
|
| + SkScalar xpos, prevXPos = 0;
|
| +
|
| + while (iter.next(&iterPath, &xpos)) {
|
| + matrix.postTranslate(xpos - prevXPos, 0);
|
| + if (iterPath) {
|
| + const SkPaint& pnt = iter.getPaint();
|
| + GrBlurUtils::drawPathWithMaskFilter(context, dc, clip, *iterPath,
|
| + pnt, viewMatrix, &matrix, clipBounds, false);
|
| + }
|
| + prevXPos = xpos;
|
| + }
|
| +}
|
| +
|
| +void GrTextUtils::DrawPosTextAsPath(GrContext* context,
|
| + GrDrawContext* dc,
|
| + const SkSurfaceProps& props,
|
| + const GrClip& clip,
|
| + const SkPaint& origPaint, const SkMatrix& viewMatrix,
|
| + const char text[], size_t byteLength,
|
| + const SkScalar pos[], int scalarsPerPosition,
|
| + const SkPoint& offset, const SkIRect& clipBounds) {
|
| + // setup our std paint, in hopes of getting hits in the cache
|
| + SkPaint paint(origPaint);
|
| + SkScalar matrixScale = paint.setupForAsPaths();
|
| +
|
| + SkMatrix matrix;
|
| + matrix.setScale(matrixScale, matrixScale);
|
| +
|
| + // Temporarily jam in kFill, so we only ever ask for the raw outline from the cache.
|
| + paint.setStyle(SkPaint::kFill_Style);
|
| + paint.setPathEffect(nullptr);
|
| +
|
| + SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc();
|
| + SkAutoGlyphCache autoCache(paint, &props, nullptr);
|
| + SkGlyphCache* cache = autoCache.getCache();
|
| +
|
| + const char* stop = text + byteLength;
|
| + SkTextAlignProc alignProc(paint.getTextAlign());
|
| + SkTextMapStateProc tmsProc(SkMatrix::I(), offset, scalarsPerPosition);
|
| +
|
| + // Now restore the original settings, so we "draw" with whatever style/stroking.
|
| + paint.setStyle(origPaint.getStyle());
|
| + paint.setPathEffect(origPaint.getPathEffect());
|
| +
|
| + while (text < stop) {
|
| + const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0);
|
| + if (glyph.fWidth) {
|
| + const SkPath* path = cache->findPath(glyph);
|
| + if (path) {
|
| + SkPoint tmsLoc;
|
| + tmsProc(pos, &tmsLoc);
|
| + SkPoint loc;
|
| + alignProc(tmsLoc, glyph, &loc);
|
| +
|
| + matrix[SkMatrix::kMTransX] = loc.fX;
|
| + matrix[SkMatrix::kMTransY] = loc.fY;
|
| + GrBlurUtils::drawPathWithMaskFilter(context, dc, clip, *path, paint,
|
| + viewMatrix, &matrix, clipBounds, false);
|
| + }
|
| + }
|
| + pos += scalarsPerPosition;
|
| + }
|
| +}
|
|
|