| Index: src/gpu/GrAtlasTextContext.cpp
|
| diff --git a/src/gpu/GrAtlasTextContext.cpp b/src/gpu/GrAtlasTextContext.cpp
|
| index 4d6a675d991b56c6a573749708b20d86a21d041f..f8004656c10207c976daf982525506565607ff70 100644
|
| --- a/src/gpu/GrAtlasTextContext.cpp
|
| +++ b/src/gpu/GrAtlasTextContext.cpp
|
| @@ -27,6 +27,7 @@
|
| #include "SkDraw.h"
|
| #include "SkDrawFilter.h"
|
| #include "SkDrawProcs.h"
|
| +#include "SkFindAndPlaceGlyph.h"
|
| #include "SkGlyphCache.h"
|
| #include "SkGpuDevice.h"
|
| #include "SkGrPriv.h"
|
| @@ -915,138 +916,19 @@ void GrAtlasTextContext::internalDrawBMPPosText(GrAtlasTextBlob* blob, int runIn
|
| // Get GrFontScaler from cache
|
| GrFontScaler* fontScaler = GetGrFontScaler(cache);
|
|
|
| - const char* stop = text + byteLength;
|
| - SkTextAlignProc alignProc(skPaint.getTextAlign());
|
| - SkTextMapStateProc tmsProc(viewMatrix, offset, scalarsPerPosition);
|
| -
|
| - if (cache->isSubpixel()) {
|
| - // maybe we should skip the rounding if linearText is set
|
| - SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(viewMatrix);
|
| -
|
| - SkFixed fxMask = ~0;
|
| - SkFixed fyMask = ~0;
|
| - SkScalar halfSampleX = SkFixedToScalar(SkGlyph::kSubpixelRound);
|
| - SkScalar halfSampleY = SkFixedToScalar(SkGlyph::kSubpixelRound);
|
| - if (kX_SkAxisAlignment == baseline) {
|
| - fyMask = 0;
|
| - halfSampleY = SK_ScalarHalf;
|
| - } else if (kY_SkAxisAlignment == baseline) {
|
| - fxMask = 0;
|
| - halfSampleX = SK_ScalarHalf;
|
| + SkFindAndPlaceGlyph::ProcessPosText(
|
| + text, byteLength, offset, viewMatrix, pos, scalarsPerPosition,
|
| + skPaint.getTextAlign(), glyphCacheProc, cache,
|
| + [&](const SkGlyph& glyph, SkPoint position, SkPoint rounding) {
|
| + position += rounding;
|
| + this->bmpAppendGlyph(
|
| + blob, runIndex, glyph,
|
| + SkScalarFloorToInt(position.fX), SkScalarFloorToInt(position.fY),
|
| + color, fontScaler, clipRect);
|
| }
|
| -
|
| - if (SkPaint::kLeft_Align == skPaint.getTextAlign()) {
|
| - while (text < stop) {
|
| - SkPoint tmsLoc;
|
| - tmsProc(pos, &tmsLoc);
|
| - Sk48Dot16 fx = SkScalarTo48Dot16(tmsLoc.fX + halfSampleX);
|
| - Sk48Dot16 fy = SkScalarTo48Dot16(tmsLoc.fY + halfSampleY);
|
| -
|
| - const SkGlyph& glyph = glyphCacheProc(cache, &text,
|
| - fx & fxMask, fy & fyMask);
|
| -
|
| - if (glyph.fWidth) {
|
| - this->bmpAppendGlyph(blob,
|
| - runIndex,
|
| - glyph,
|
| - Sk48Dot16FloorToInt(fx),
|
| - Sk48Dot16FloorToInt(fy),
|
| - color,
|
| - fontScaler,
|
| - clipRect);
|
| - }
|
| - pos += scalarsPerPosition;
|
| - }
|
| - } else {
|
| - while (text < stop) {
|
| - const char* currentText = text;
|
| - const SkGlyph& metricGlyph = glyphCacheProc(cache, &text, 0, 0);
|
| -
|
| - if (metricGlyph.fWidth) {
|
| - SkDEBUGCODE(SkFixed prevAdvX = metricGlyph.fAdvanceX;)
|
| - SkDEBUGCODE(SkFixed prevAdvY = metricGlyph.fAdvanceY;)
|
| - SkPoint tmsLoc;
|
| - tmsProc(pos, &tmsLoc);
|
| - SkPoint alignLoc;
|
| - alignProc(tmsLoc, metricGlyph, &alignLoc);
|
| -
|
| - Sk48Dot16 fx = SkScalarTo48Dot16(alignLoc.fX + halfSampleX);
|
| - Sk48Dot16 fy = SkScalarTo48Dot16(alignLoc.fY + halfSampleY);
|
| -
|
| - // have to call again, now that we've been "aligned"
|
| - const SkGlyph& glyph = glyphCacheProc(cache, ¤tText,
|
| - fx & fxMask, fy & fyMask);
|
| - // the assumption is that the metrics haven't changed
|
| - SkASSERT(prevAdvX == glyph.fAdvanceX);
|
| - SkASSERT(prevAdvY == glyph.fAdvanceY);
|
| - SkASSERT(glyph.fWidth);
|
| -
|
| - this->bmpAppendGlyph(blob,
|
| - runIndex,
|
| - glyph,
|
| - Sk48Dot16FloorToInt(fx),
|
| - Sk48Dot16FloorToInt(fy),
|
| - color,
|
| - fontScaler,
|
| - clipRect);
|
| - }
|
| - pos += scalarsPerPosition;
|
| - }
|
| - }
|
| - } else { // not subpixel
|
| -
|
| - if (SkPaint::kLeft_Align == skPaint.getTextAlign()) {
|
| - while (text < stop) {
|
| - // the last 2 parameters are ignored
|
| - const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0);
|
| -
|
| - if (glyph.fWidth) {
|
| - SkPoint tmsLoc;
|
| - tmsProc(pos, &tmsLoc);
|
| -
|
| - Sk48Dot16 fx = SkScalarTo48Dot16(tmsLoc.fX + SK_ScalarHalf); //halfSampleX;
|
| - Sk48Dot16 fy = SkScalarTo48Dot16(tmsLoc.fY + SK_ScalarHalf); //halfSampleY;
|
| - this->bmpAppendGlyph(blob,
|
| - runIndex,
|
| - glyph,
|
| - Sk48Dot16FloorToInt(fx),
|
| - Sk48Dot16FloorToInt(fy),
|
| - color,
|
| - fontScaler,
|
| - clipRect);
|
| - }
|
| - pos += scalarsPerPosition;
|
| - }
|
| - } else {
|
| - while (text < stop) {
|
| - // the last 2 parameters are ignored
|
| - const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0);
|
| -
|
| - if (glyph.fWidth) {
|
| - SkPoint tmsLoc;
|
| - tmsProc(pos, &tmsLoc);
|
| -
|
| - SkPoint alignLoc;
|
| - alignProc(tmsLoc, glyph, &alignLoc);
|
| -
|
| - Sk48Dot16 fx = SkScalarTo48Dot16(alignLoc.fX + SK_ScalarHalf); //halfSampleX;
|
| - Sk48Dot16 fy = SkScalarTo48Dot16(alignLoc.fY + SK_ScalarHalf); //halfSampleY;
|
| - this->bmpAppendGlyph(blob,
|
| - runIndex,
|
| - glyph,
|
| - Sk48Dot16FloorToInt(fx),
|
| - Sk48Dot16FloorToInt(fy),
|
| - color,
|
| - fontScaler,
|
| - clipRect);
|
| - }
|
| - pos += scalarsPerPosition;
|
| - }
|
| - }
|
| - }
|
| + );
|
| }
|
|
|
| -
|
| void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex,
|
| const SkPaint& skPaint, GrColor color,
|
| const SkMatrix& viewMatrix,
|
|
|