Index: src/gpu/GrTextContext.cpp |
diff --git a/src/gpu/GrTextContext.cpp b/src/gpu/GrTextContext.cpp |
index 869706e6527aee6adf5c55d2747cf083b613702c..94c05a712439a8c8498c899a0059574df4c9e187 100644 |
--- a/src/gpu/GrTextContext.cpp |
+++ b/src/gpu/GrTextContext.cpp |
@@ -44,63 +44,16 @@ |
const char text[], size_t byteLength, |
SkScalar x, SkScalar y) { |
- SkASSERT(byteLength == 0 || text != NULL); |
+ GrTextContext* textContext = this; |
+ do { |
+ if (textContext->canDraw(skPaint)) { |
+ textContext->onDrawText(paint, skPaint, text, byteLength, x, y); |
+ return true; |
+ } |
+ textContext = textContext->fFallbackTextContext; |
+ } while (textContext); |
- // 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); |
+ return false; |
} |
bool GrTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPaint, |