のねのBlog

パソコンの問題や、ソフトウェアの開発で起きた問題など書いていきます。よろしくお願いします^^。

getContextFromChar

 <S> : SkScalerCtx::charToGlyphID      uni=0x6708 
 <S> : SkScalerCtx::getContextFromChar uni=0x6708
 <S> : SkScalerCtx::allocNextContext

 new fallback cache entry: "ja"
 new fallback cache entry: "ja-Jpan" -> "ja"
 new fallback cache entry: "ja-Jpan-JP" -> "ja"
 ---- nextLogicalFont: 
       currFontID=20,
       origFontID=20,
       plainFontID=20,
       plainFallbackFontIndex=-1,
       nextFallbackFontIndex=0 => nextFontID=59

 <E> : SkScalerCtx::allocNextContext newfontID=0x003B
 <V> : SkScalerCtx::getContextFromChar uni=0x6708 glyphID=0x0B8E fontID=0x003B found
 <E> : SkScalerCtx::getContextFromChar uni=0x6708 glyphID=0x0B8E fontID=0x003B <==
 <P> : SkScalerCtx::charToGlyphID uni=0x6708 glyphID=0x0B8E fontID=0x003B cnt=0x1DC6 base=0x00041C
 <E> : SkScalerCtx::charToGlyphID uni=0x6708 glyphID=0x0FAA fontID=0x003B cnt=0x1DC6 base=0x00041C
       0x1DC6=0d7622
SkScalerContext* SkScalerContext::getContextFromChar(SkUnichar uni, unsigned& glyphID) {
    LOGD("<S> : uni=0x%04X", uni); //<=uni=0x6708
    SkScalerContext* ctx = this;
    for (;;) {
        glyphID = ctx->generateCharToGlyph(uni);
        if (glyphID) {
	    LOGD("<V> : uni=0x%04X glyphID=0x%04X fontID=0x%04X found",
                  uni, glyphID, ctx->fRec.fFontID);
            /// uni=0x6708 glyphID=0x0B8E fontID=0x003B found
            break;  // found it
        }
        ctx = ctx->getNextContext();
        if (NULL == ctx) {
            LOGD("<P> ctx==NULL");
            return NULL;
        }
    }
    LOGD("<E> : uni=0x%04X glyphID=0x%04X fontID=0x%04X <==",
		uni, glyphID, ctx->fRec.fFontID);
    /// uni=0x6708 glyphID=0x0B8E fontID=0x003B <==
    return ctx;
}
uint16_t SkScalerContext::charToGlyphID(SkUnichar uni) {
    LOGD("<S> : uni=0x%04X ", uni); //<=== uni=0x6708 
    unsigned glyphID;
    SkScalerContext* ctx = getContextFromChar(uni, glyphID); //<=== 関数へ入る

    if (!ctx) {
	LOGD("<E> : uni=0x%04X no more contexts", uni);
        return 0; // no more contexts, return missing glyph
    }
    LOGD("<P> : uni=0x%04X glyphID=0x%04X fontID=0x%04X cnt=0x%04X base=0x%06X",
       uni, glyphID, ctx->fRec.fFontID,
       ctx->getGlyphCount(), ctx->fBaseGlyphCount);
       /// uni=0x6708 glyphID=0x0B8E fontID=0x003B cnt=0x1DC6 base=0x00041C
	 	 
    // add the ctx's base, making glyphID unique for chain of contexts
    glyphID += ctx->fBaseGlyphCount;
               0x0B8E + 0x041C = 0xFAA

    // check for overflow of 16bits, since our glyphID cannot exceed that
    if (glyphID > 0xFFFF) {
		LOGD("<P> : uni=0x%04X glyphID > 0xFFFF", uni);
        glyphID = 0;
    }
    LOGD("<E> : uni=0x%04X glyphID=0x%04X fontID=0x%04X cnt=0x%04X base=0x%06X",
        uni, glyphID, ctx->fRec.fFontID,
        ctx->getGlyphCount(), ctx->fBaseGlyphCount);
        /// uni=0x6708 glyphID=0x0FAA fontID=0x003B cnt=0x1DC6 base=0x00041C 
    return SkToU16(glyphID);
}