Index: src/core/SkScalerContext.cpp |
diff --git a/src/core/SkScalerContext.cpp b/src/core/SkScalerContext.cpp |
index 690ee77b3f3addb1fb8448951d46bee490dc881d..9d13a6c1206e441b6bd4f7532f142771a2211c6f 100644 |
--- a/src/core/SkScalerContext.cpp |
+++ b/src/core/SkScalerContext.cpp |
@@ -178,7 +178,35 @@ SkScalerContext* SkScalerContext::getGlyphContext(const SkGlyph& glyph) { |
return ctx; |
} |
+SkScalerContext* SkScalerContext::getContextFromChar(SkUnichar uni, |
+ uint16_t* glyphID) { |
+ SkScalerContext* ctx = this; |
+ for (;;) { |
+ const uint16_t glyph = ctx->generateCharToGlyph(uni); |
+ if (glyph) { |
+ if (NULL != glyphID) { |
+ *glyphID = glyph; |
+ } |
+ break; // found it |
+ } |
+ ctx = ctx->getNextContext(); |
+ if (NULL == ctx) { |
+ return NULL; |
+ } |
+ } |
+ return ctx; |
+} |
+ |
#ifdef SK_BUILD_FOR_ANDROID |
+SkFontID SkScalerContext::findTypefaceIdForChar(SkUnichar uni) { |
+ SkScalerContext* ctx = this->getContextFromChar(uni, NULL); |
+ if (NULL != ctx) { |
+ return ctx->fRec.fFontID; |
+ } else { |
+ return 0; |
+ } |
+} |
+ |
/* This loops through all available fallback contexts (if needed) until it |
finds some context that can handle the unichar and return it. |
@@ -186,21 +214,13 @@ SkScalerContext* SkScalerContext::getGlyphContext(const SkGlyph& glyph) { |
char of a run. |
*/ |
unsigned SkScalerContext::getBaseGlyphCount(SkUnichar uni) { |
- SkScalerContext* ctx = this; |
- unsigned glyphID; |
- for (;;) { |
- glyphID = ctx->generateCharToGlyph(uni); |
- if (glyphID) { |
- break; // found it |
- } |
- ctx = ctx->getNextContext(); |
- if (NULL == ctx) { |
- SkDebugf("--- no context for char %x\n", uni); |
- // just return the original context (this) |
- return this->fBaseGlyphCount; |
- } |
+ SkScalerContext* ctx = this->getContextFromChar(uni, NULL); |
+ if (NULL != ctx) { |
+ return ctx->fBaseGlyphCount; |
+ } else { |
+ SkDEBUGF(("--- no context for char %x\n", uni)); |
+ return this->fBaseGlyphCount; |
} |
- return ctx->fBaseGlyphCount; |
} |
#endif |
@@ -208,20 +228,14 @@ unsigned SkScalerContext::getBaseGlyphCount(SkUnichar uni) { |
finds some context that can handle the unichar. If all fail, returns 0 |
*/ |
uint16_t SkScalerContext::charToGlyphID(SkUnichar uni) { |
- SkScalerContext* ctx = this; |
- unsigned glyphID; |
- for (;;) { |
- glyphID = ctx->generateCharToGlyph(uni); |
- if (glyphID) { |
- break; // found it |
- } |
- ctx = ctx->getNextContext(); |
- if (NULL == ctx) { |
- return 0; // no more contexts, return missing glyph |
- } |
+ |
+ uint16_t tempID; |
+ SkScalerContext* ctx = this->getContextFromChar(uni, &tempID); |
+ if (NULL == ctx) { |
+ return 0; // no more contexts, return missing glyph |
} |
// add the ctx's base, making glyphID unique for chain of contexts |
- glyphID += ctx->fBaseGlyphCount; |
+ unsigned glyphID = tempID + ctx->fBaseGlyphCount; |
// check for overflow of 16bits, since our glyphID cannot exceed that |
if (glyphID > 0xFFFF) { |
glyphID = 0; |