| Index: src/gpu/GrTextContext.cpp
|
| diff --git a/src/gpu/GrTextContext.cpp b/src/gpu/GrTextContext.cpp
|
| index 94c05a712439a8c8498c899a0059574df4c9e187..869706e6527aee6adf5c55d2747cf083b613702c 100644
|
| --- a/src/gpu/GrTextContext.cpp
|
| +++ b/src/gpu/GrTextContext.cpp
|
| @@ -44,16 +44,63 @@ bool GrTextContext::drawText(const GrPaint& paint, const SkPaint& skPaint,
|
| const char text[], size_t byteLength,
|
| SkScalar x, SkScalar y) {
|
|
|
| - GrTextContext* textContext = this;
|
| - do {
|
| - if (textContext->canDraw(skPaint)) {
|
| - textContext->onDrawText(paint, skPaint, text, byteLength, x, y);
|
| - return true;
|
| - }
|
| - textContext = textContext->fFallbackTextContext;
|
| - } while (textContext);
|
| + SkASSERT(byteLength == 0 || text != NULL);
|
|
|
| - return false;
|
| + // nothing to draw
|
| + if (text == NULL || byteLength == 0) {
|
| + return true;
|
| + }
|
| +
|
| + SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc();
|
| + SkAutoGlyphCache autoCache(skPaint, &fDeviceProperties, NULL);
|
| + SkGlyphCache* cache = autoCache.getCache();
|
| +
|
| + SkTArray<SkScalar> positions;
|
| +
|
| + const char* textPtr = text;
|
| + SkFixed stopX = 0;
|
| + SkFixed stopY = 0;
|
| + SkFixed origin;
|
| + switch (skPaint.getTextAlign()) {
|
| + case SkPaint::kRight_Align: origin = SK_Fixed1; break;
|
| + case SkPaint::kCenter_Align: origin = SK_FixedHalf; break;
|
| + case SkPaint::kLeft_Align: origin = 0; break;
|
| + default: SkFAIL("Invalid paint origin"); return false;
|
| + }
|
| +
|
| + SkAutoKern autokern;
|
| + const char* stop = text + byteLength;
|
| + while (textPtr < stop) {
|
| + // don't need x, y here, since all subpixel variants will have the
|
| + // same advance
|
| + const SkGlyph& glyph = glyphCacheProc(cache, &textPtr, 0, 0);
|
| +
|
| + SkFixed width = glyph.fAdvanceX + autokern.adjust(glyph);
|
| + positions.push_back(SkFixedToScalar(stopX + SkFixedMul_portable(origin, width)));
|
| +
|
| + SkFixed height = glyph.fAdvanceY;
|
| + positions.push_back(SkFixedToScalar(stopY + SkFixedMul_portable(origin, height)));
|
| +
|
| + stopX += width;
|
| + stopY += height;
|
| + }
|
| + SkASSERT(textPtr == stop);
|
| +
|
| + // now adjust starting point depending on alignment
|
| + SkScalar alignX = SkFixedToScalar(stopX);
|
| + SkScalar alignY = SkFixedToScalar(stopY);
|
| + if (skPaint.getTextAlign() == SkPaint::kCenter_Align) {
|
| + alignX = SkScalarHalf(alignX);
|
| + alignY = SkScalarHalf(alignY);
|
| + } else if (skPaint.getTextAlign() == SkPaint::kLeft_Align) {
|
| + alignX = 0;
|
| + alignY = 0;
|
| + }
|
| + x -= alignX;
|
| + y -= alignY;
|
| + SkPoint offset = SkPoint::Make(x, y);
|
| +
|
| + return this->drawPosText(paint, skPaint, text, byteLength, positions.begin(), 2, offset);
|
| }
|
|
|
| bool GrTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPaint,
|
|
|