のねのBlog

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

drawText

    377 #if !OS(WINCE) || PLATFORM(QT)
    378 void GraphicsContext::drawText(const Font& font, const TextRun& run, const FloatPoint& point, int from, int to)
    379 {
    380     if (paintingDisabled())
    381         return;
    382 
    383     font.drawText(this, run, point, from, to); <==========
    384 }
    385 #endif
    127 void Font::drawText(GraphicsContext* context, const TextRun& run, const FloatPoint& point, int from, int to) const
    128 {
    129     // Don't draw anything while we are using custom fonts that are in the process of loading.
    130     if (loadingCustomFonts())
    131         return;
    132 
    133     to = (to == -1 ? run.length() : to);
    134 
    135 #if ENABLE(SVG_FONTS)
    136     if (primaryFont()->isSVGFont()) {
    137         drawTextUsingSVGFont(context, run, point, from, to);
    138         return;
    139     }
    140 #endif
    141 
    142     if (codePath(run) != Complex)
    143         return drawSimpleText(context, run, point, from, to); <==========
    144 
    145     return drawComplexText(context, run, point, from, to);
    146 }
    353 void Font::drawSimpleText(GraphicsContext* context, const TextRun& run, const FloatPoint& point, int from, int to) const
    354 {
    355     // This glyph buffer holds our glyphs+advances+font data for each glyph.
    356     GlyphBuffer glyphBuffer;
    357 
    358     float startX = point.x() + getGlyphsAndAdvancesForSimpleText(run, from, to, glyphBuffer); <===========
    359 
    360     if (glyphBuffer.isEmpty())
    361         return;
    362 
    363     FloatPoint startPoint(startX, point.y());
    364     drawGlyphBuffer(context, glyphBuffer, startPoint); <==========
    365 }
    378 void Font::drawGlyphBuffer(GraphicsContext* context, const GlyphBuffer& glyphBuffer, const FloatPoint& point) const
    379 {
    380     // Draw each contiguous run of glyphs that use the same font data.
    381     const SimpleFontData* fontData = glyphBuffer.fontDataAt(0);
    382     FloatSize offset = glyphBuffer.offsetAt(0);
    383     FloatPoint startPoint(point);
    384     float nextX = startPoint.x();
    385     int lastFrom = 0;
    386     int nextGlyph = 0;
    387     while (nextGlyph < glyphBuffer.size()) {
    388         const SimpleFontData* nextFontData = glyphBuffer.fontDataAt(nextGlyph);
    389         FloatSize nextOffset = glyphBuffer.offsetAt(nextGlyph);
    390         if (nextFontData != fontData || nextOffset != offset) {
    391             drawGlyphs(context, fontData, glyphBuffer, lastFrom, nextGlyph - lastFrom, startPoint);
    392 
    393             lastFrom = nextGlyph;
    394             fontData = nextFontData;
    395             offset = nextOffset;
    396             startPoint.setX(nextX);
    397         }
    398         nextX += glyphBuffer.advanceAt(nextGlyph);
    399         nextGlyph++;
    400     }
    401 
    402     drawGlyphs(context, fontData, glyphBuffer, lastFrom, nextGlyph - lastFrom, startPoint);
    403 }
    190 void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font,
    191                       const GlyphBuffer& glyphBuffer,  int from, int numGlyphs,
    192                       const FloatPoint& point) const
    193 {
    194     // compile-time assert
    195     SkASSERT(sizeof(GlyphBufferGlyph) == sizeof(uint16_t));
    196 
    197     if (numGlyphs == 1 && glyphBuffer.glyphAt(from) == 0x3) {
    198         // Webkit likes to draw end text control command for some reason
    199         // Just ignore it
    200         return;
    201     }
    202 
    203     SkPaint paint;
    204     if (!setupForText(&paint, gc, font)) {
    205         return;
    206     }
    207 
    208     SkScalar                    x = SkFloatToScalar(point.x());
    209     SkScalar                    y = SkFloatToScalar(point.y());
    210     const GlyphBufferGlyph*     glyphs = glyphBuffer.glyphs(from);
    211     const GlyphBufferAdvance*   adv = glyphBuffer.advances(from);
    212     SkAutoSTMalloc<32, SkPoint> storage(numGlyphs), storage2(numGlyphs), storage3(numGlyphs);
    213     SkPoint*                    pos = storage.get();
    214 
    215     SkCanvas* canvas = gc->platformContext()->recordingCanvas();
    216 
    217     /*  We need an array of [x,y,x,y,x,y,...], but webkit is giving us
    218         point.xy + [width, height, width, height, ...], so we have to convert
    219      */
    220 
    221     if (font->platformData().orientation() == Vertical) {
    222         float yOffset = SkFloatToScalar(font->fontMetrics().floatAscent(IdeographicBaseline) - font->fontMetrics().floatAscent());
    223         gc->platformContext()->setTextOffset(FloatSize(0.0f, -yOffset)); // compensate for offset in bounds calculation
    224         y += yOffset;
    225     }
    226 
    227     if (EmojiFont::IsAvailable()) {
    228         // set filtering, to make scaled images look nice(r)
    229         paint.setFilterBitmap(true);
    230 
    231         SkMatrix rotator;
    232         rotator.reset();
    233         if (font->platformData().orientation() == Vertical) {
    234             canvas->save();
    235             canvas->rotate(-90);
    236             rotator.setRotate(90);
    237         }
    238 
    239         int localIndex = 0;
    240         int localCount = 0;
    241         for (int i = 0; i < numGlyphs; i++) {
    242             if (EmojiFont::IsEmojiGlyph(glyphs[i])) {
    243                 if (localCount) {
    244                     rotator.mapPoints(&pos[localIndex], localCount);
    245                     canvas->drawPosText(&glyphs[localIndex],
    246                                      localCount * sizeof(uint16_t),
    247                                      &pos[localIndex], paint);
    248                 }
    249                 EmojiFont::Draw(canvas, glyphs[i], x, y, paint);
    250                 // reset local index/count track for "real" glyphs
    251                 localCount = 0;
    252                 localIndex = i + 1;
    253             } else {
    254                 pos[i].set(x, y);
    255                 localCount += 1;
    256             }
    257             x += SkFloatToScalar(adv[i].width());
    258             y += SkFloatToScalar(adv[i].height());
    259         }
    260 
    261         // draw the last run of glyphs (if any)
    262         if (localCount) {
    263             rotator.mapPoints(&pos[localIndex], localCount);
    264             canvas->drawPosText(&glyphs[localIndex],
    265                              localCount * sizeof(uint16_t),
    266                              &pos[localIndex], paint);
    267 
    268         }
    269 
    270         if (font->platformData().orientation() == Vertical)
    271             canvas->restore();
    272     } else {
    273         for (int i = 0; i < numGlyphs; i++) {
    274             pos[i].set(x, y);
    275             y += SkFloatToScalar(adv[i].height());
    276             x += SkFloatToScalar(adv[i].width());
    277         }
    278 
    279         if (font->platformData().orientation() == Vertical) {
    280             canvas->save();
    281             canvas->rotate(-90);
    282             SkMatrix rotator;
    283             rotator.reset();
    284             rotator.setRotate(90);
    285             rotator.mapPoints(pos, numGlyphs);
    286         }
    287         canvas->drawPosText(glyphs,
    288             numGlyphs * sizeof(uint16_t), pos, paint);
    289 
    290         if (font->platformData().orientation() == Vertical)
    291             canvas->restore();
    292     }
    293 
    294     if (font->platformData().orientation() == Vertical)
    295         gc->platformContext()->setTextOffset(FloatSize()); // reset to undo above
    296 }

これなのかな?

   1717 void SkCanvas::drawPosText(const void* text, size_t byteLength,
   1718                            const SkPoint pos[], const SkPaint& paint) {
   1719     LOOPER_BEGIN(paint, SkDrawFilter::kText_Type)
   1720 
   1721     while (iter.next()) {
   1722         SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint());
   1723         iter.fDevice->drawPosText(iter, text, byteLength, &pos->fX, 0, 2,
   1724                                   dfp.paint());
   1725     }
   1726 
   1727     LOOPER_END
   1728 }
||<  
></blockquote><

*1367742221*[android][skia]drawGlyphs
><blockquote cite="http://tools.oesf.biz/android-4.2.0_r1.0/xref/external/webkit/Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp#190" title="Cross Reference: /external/webkit/Source/WebCore/platform/graphics/android/fonts/FontAndroid.cpp"><
>|cpp|
    190 void Font::drawGlyphs(GraphicsContext* gc, const SimpleFontData* font,
    191                       const GlyphBuffer& glyphBuffer,  int from, int numGlyphs,
    192                       const FloatPoint& point) const
    193 {
    194     // compile-time assert
    195     SkASSERT(sizeof(GlyphBufferGlyph) == sizeof(uint16_t));
    196 
    197     if (numGlyphs == 1 && glyphBuffer.glyphAt(from) == 0x3) {
    198         // Webkit likes to draw end text control command for some reason
    199         // Just ignore it
    200         return;
    201     }
    202 
    203     SkPaint paint;
    204     if (!setupForText(&paint, gc, font)) {
    205         return;
    206     }
    207 
    208     SkScalar                    x = SkFloatToScalar(point.x());
    209     SkScalar                    y = SkFloatToScalar(point.y());
    210     const GlyphBufferGlyph*     glyphs = glyphBuffer.glyphs(from);
    211     const GlyphBufferAdvance*   adv = glyphBuffer.advances(from);
    212     SkAutoSTMalloc<32, SkPoint> storage(numGlyphs), storage2(numGlyphs), storage3(numGlyphs);
    213     SkPoint*                    pos = storage.get();
    214 
    215     SkCanvas* canvas = gc->platformContext()->recordingCanvas();
    216 
    217     /*  We need an array of [x,y,x,y,x,y,...], but webkit is giving us
    218         point.xy + [width, height, width, height, ...], so we have to convert
    219      */
    220 
    221     if (font->platformData().orientation() == Vertical) {
    222         float yOffset = SkFloatToScalar(font->fontMetrics().floatAscent(IdeographicBaseline) - font->fontMetrics().floatAscent());
    223         gc->platformContext()->setTextOffset(FloatSize(0.0f, -yOffset)); // compensate for offset in bounds calculation
    224         y += yOffset;
    225     }
    226 
    227     if (EmojiFont::IsAvailable()) {
    228         // set filtering, to make scaled images look nice(r)
    229         paint.setFilterBitmap(true);
    230 
    231         SkMatrix rotator;
    232         rotator.reset();
    233         if (font->platformData().orientation() == Vertical) {
    234             canvas->save();
    235             canvas->rotate(-90);
    236             rotator.setRotate(90);
    237         }
    238 
    239         int localIndex = 0;
    240         int localCount = 0;
    241         for (int i = 0; i < numGlyphs; i++) {
    242             if (EmojiFont::IsEmojiGlyph(glyphs[i])) {
    243                 if (localCount) {
    244                     rotator.mapPoints(&pos[localIndex], localCount);
    245                     canvas->drawPosText(&glyphs[localIndex],
    246                                      localCount * sizeof(uint16_t),
    247                                      &pos[localIndex], paint);
    248                 }
    249                 EmojiFont::Draw(canvas, glyphs[i], x, y, paint);
    250                 // reset local index/count track for "real" glyphs
    251                 localCount = 0;
    252                 localIndex = i + 1;
    253             } else {
    254                 pos[i].set(x, y);
    255                 localCount += 1;
    256             }
    257             x += SkFloatToScalar(adv[i].width());
    258             y += SkFloatToScalar(adv[i].height());
    259         }
    260 
    261         // draw the last run of glyphs (if any)
    262         if (localCount) {
    263             rotator.mapPoints(&pos[localIndex], localCount);
    264             canvas->drawPosText(&glyphs[localIndex],
    265                              localCount * sizeof(uint16_t),
    266                              &pos[localIndex], paint);
    267 
    268         }
    269 
    270         if (font->platformData().orientation() == Vertical)
    271             canvas->restore();
    272     } else {
    273         for (int i = 0; i < numGlyphs; i++) {
    274             pos[i].set(x, y);
    275             y += SkFloatToScalar(adv[i].height());
    276             x += SkFloatToScalar(adv[i].width());
    277         }
    278 
    279         if (font->platformData().orientation() == Vertical) {
    280             canvas->save();
    281             canvas->rotate(-90);
    282             SkMatrix rotator;
    283             rotator.reset();
    284             rotator.setRotate(90);
    285             rotator.mapPoints(pos, numGlyphs);
    286         }
    287         canvas->drawPosText(glyphs,
    288             numGlyphs * sizeof(uint16_t), pos, paint);
    289 
    290         if (font->platformData().orientation() == Vertical)
    291             canvas->restore();
    292     }
    293 
    294     if (font->platformData().orientation() == Vertical)
    295         gc->platformContext()->setTextOffset(FloatSize()); // reset to undo above
    296 }
    325 float Font::getGlyphsAndAdvancesForSimpleText(const TextRun& run, int from, int to, GlyphBuffer& glyphBuffer, ForTextEmphasisOrNot forTextEmphasis) const
    326 {
    327     float initialAdvance;
    328 
    329     WidthIterator it(this, run, 0, false, forTextEmphasis);
    330     it.advance(from);
    331     float beforeWidth = it.m_runWidthSoFar;
    332     it.advance(to, &glyphBuffer);
    333 
    334     if (glyphBuffer.isEmpty())
    335         return 0;
    336 
    337     float afterWidth = it.m_runWidthSoFar;
    338 
    339     if (run.rtl()) {
    340         it.advance(run.length());
    341         initialAdvance = it.m_runWidthSoFar - afterWidth;
    342     } else
    343         initialAdvance = beforeWidth;
    344 
    345     if (run.rtl()) {
    346         for (int i = 0, end = glyphBuffer.size() - 1; i < glyphBuffer.size() / 2; ++i, --end)
    347             glyphBuffer.swap(i, end);
    348     }
    349 
    350     return initialAdvance;
    351 }
||<  
></blockquote><

*1367713995*[android][skia]loadSystemFontsLocked>initSystemFontsLocked>dumpGlobalsLocked
><blockquote cite="http://tools.oesf.biz/android-4.2.0_r1.0/xref/external/skia/src/ports/SkFontHost_android.cpp#876" title="Cross Reference: /external/skia/src/ports/SkFontHost_android.cpp"><
loadSystemFontsLockedは、以下の4箇所から呼ばれる。
>|cpp|
    876 static SkTypeface* deserializeLocked(SkStream* stream) {

    934 static SkTypeface* createTypefaceLocked(const SkTypeface* familyFace,
    935         const char familyName[], const void* data, size_t bytelength,
    936         SkTypeface::Style style) {

   1005 static SkFontID nextLogicalFontLocked(const SkScalerContext::Rec& rec) {

   1064 static SkTypeface* createTypefaceFromStreamLocked(SkStream* stream) {
    824 static void loadSystemFontsLocked() {
    825     if (!gDefaultNormal) {
    826         initSystemFontsLocked();
    827     }
    828 }
    733 /*
    734  *  Called once (ensured by the sentinel check at the beginning of our body).
    735  *  Initializes all the globals, and register the system fonts.
    736  */
    737 static void initSystemFontsLocked() {
    738     // check if we've already been called
    739     if (gDefaultNormal) {
    740         return;
    741     }
    742 
    743     SkASSERT(gUniqueFontID == 0);
    744 
    745     loadFontInfoLocked();
    746 
    747     SkTypeface* firstInFamily = NULL;
    748     for (int i = 0; i < gSystemFonts.count(); i++) {
    749         // if we're the first in a new family, clear firstInFamily
    750         const char* const* names = gSystemFonts[i].fNames;
    751         if (names != NULL) {
    752             firstInFamily = NULL;
    753         }
    754 
    755         bool isFixedWidth;
    756         SkString name;
    757         SkTypeface::Style style;
    758 
    759         // we expect all the fonts, except the "fallback" fonts
    760         bool isExpected = (names != gFBNames);
    761         if (!getNameAndStyle(gSystemFonts[i].fFileName, &name, &style,
    762                 &isFixedWidth, isExpected)) {
    763             // We need to increase gUniqueFontID here so that the unique id of
    764             // each font matches its index in gSystemFonts array, as expected
    765             // by findUniqueIDLocked.
    766             sk_atomic_inc(&gUniqueFontID);
    767             continue;
    768         }
    769 
    770         SkString fullpath;
    771         getFullPathForSysFonts(&fullpath, gSystemFonts[i].fFileName);
    772 
    773         SkTypeface* tf = SkNEW_ARGS(FileTypeface, (style,
    774                 true,  // system-font (cannot delete)
    775                 fullpath.c_str(), // filename
    776                 isFixedWidth));
    777         addTypefaceLocked(tf, firstInFamily);
    778 
    779         SkDEBUGF(("---- SkTypeface[%d] %s fontID %d\n",
    780                   i, gSystemFonts[i].fFileName, tf->uniqueID()));
    781 
    782         if (names != NULL) {
    783             // see if this is one of our fallback fonts
    784             if (names == gFBNames) {
    785                 // add to appropriate fallback chains
    786                 FallbackFontRec fallbackRec;
    787                 fallbackRec.fFontID = tf->uniqueID();
    788                 fallbackRec.fVariant = gSystemFonts[i].fVariant;
    789                 addFallbackFontLocked(fallbackRec, gSystemFonts[i].fLanguage);
    790             }
    791 
    792             firstInFamily = tf;
    793             FamilyRec* family = findFamilyLocked(tf);
    794 
    795             // record the default family if this is it
    796             if (names == gDefaultNames) {
    797                 gDefaultFamily = family;
    798             }
    799             // add the names to map to this family
    800             while (*names) {
    801                 addNameLocked(*names, family);
    802                 names += 1;
    803             }
    804         }
    805     }
    806     finaliseFallbackFontListsLocked();
    807 
    808     // do this after all fonts are loaded. This is our default font, and it
    809     // acts as a sentinel so we only execute loadSystemFontsLocked() once
    810     gDefaultNormal = findBestFaceLocked(gDefaultFamily, SkTypeface::kNormal);
    811 
    812     SkDEBUGCODE(dumpGlobalsLocked());
    813 }
    452 static void dumpGlobalsLocked() {
    453     SkDebugf("gDefaultNormal=%p id=%u refCnt=%d", gDefaultNormal,
    454              gDefaultNormal ? gDefaultNormal->uniqueID() : 0,
    455              gDefaultNormal ? gDefaultNormal->getRefCnt() : 0);
    456 
    457     if (gDefaultFamily) {
    458         SkDebugf("gDefaultFamily=%p fFaces={%u,%u,%u,%u} refCnt={%d,%d,%d,%d}",
    459                  gDefaultFamily,
    460                  gDefaultFamily->fFaces[0] ? gDefaultFamily->fFaces[0]->uniqueID() : 0,
    461                  gDefaultFamily->fFaces[1] ? gDefaultFamily->fFaces[1]->uniqueID() : 0,
    462                  gDefaultFamily->fFaces[2] ? gDefaultFamily->fFaces[2]->uniqueID() : 0,
    463                  gDefaultFamily->fFaces[3] ? gDefaultFamily->fFaces[3]->uniqueID() : 0,
    464                  gDefaultFamily->fFaces[0] ? gDefaultFamily->fFaces[0]->getRefCnt() : 0,
    465                  gDefaultFamily->fFaces[1] ? gDefaultFamily->fFaces[1]->getRefCnt() : 0,
    466                  gDefaultFamily->fFaces[2] ? gDefaultFamily->fFaces[2]->getRefCnt() : 0,
    467                  gDefaultFamily->fFaces[3] ? gDefaultFamily->fFaces[3]->getRefCnt() : 0);
    468     } else {
    469         SkDebugf("gDefaultFamily=%p", gDefaultFamily);
    470     }
    471 
    472     FallbackFontList* defaultFallbackList =
    473             getFallbackFontListLocked(SkLanguage());
    474     SkASSERT(defaultFallbackList != NULL);
    475     SkDebugf("gSystemFonts.count()=%d defaultFallbackList->fList.count()=%d",
    476            gSystemFonts.count(), defaultFallbackList->fList.count());
    477 
    478     for (int i = 0; i < gSystemFonts.count(); ++i) {
    479         SkDebugf("gSystemFonts[%d] fileName=%s", i, gSystemFonts[i].fFileName);
    480         size_t namesIndex = 0;
    481         if (gSystemFonts[i].fNames)
    482             for (const char* fontName = gSystemFonts[i].fNames[namesIndex];
    483                     fontName != 0;
    484                     fontName = gSystemFonts[i].fNames[++namesIndex]) {
    485                 SkDebugf("       name[%u]=%s", namesIndex, fontName);
    486             }
    487     }
    488 
    489     if (gFamilyHead) {
    490         FamilyRec* rec = gFamilyHead;
    491         int i=0;
    492         while (rec) {
    493             SkDebugf("gFamilyHead[%d]=%p fFaces={%u,%u,%u,%u} refCnt={%d,%d,%d,%d}",
    494                      i++, rec,
    495                      rec->fFaces[0] ? rec->fFaces[0]->uniqueID() : 0,
    496                      rec->fFaces[1] ? rec->fFaces[1]->uniqueID() : 0,
    497                      rec->fFaces[2] ? rec->fFaces[2]->uniqueID() : 0,
    498                      rec->fFaces[3] ? rec->fFaces[3]->uniqueID() : 0,
    499                      rec->fFaces[0] ? rec->fFaces[0]->getRefCnt() : 0,
    500                      rec->fFaces[1] ? rec->fFaces[1]->getRefCnt() : 0,
    501                      rec->fFaces[2] ? rec->fFaces[2]->getRefCnt() : 0,
    502                      rec->fFaces[3] ? rec->fFaces[3]->getRefCnt() : 0);
    503             rec = rec->fNext;
    504         }
    505     } else {
    506         SkDebugf("gFamilyHead=%p", gFamilyHead);
    507     }
    508 
    509 }
05-05 00:45:19.093: D/skia(128): gDefaultNormal=0x400ad840 id=1 refCnt=1
05-05 00:45:19.093: D/skia(128): gDefaultFamily=0x400ad8b0 fFaces={1,2,3,4} refCnt={1,1,1,1}
05-05 00:45:19.093: D/skia(128): new fallback cache entry: ""
05-05 00:45:19.093: D/skia(128): gSystemFonts.count()=38 defaultFallbackList->fList.count()=17
05-05 00:45:19.093: D/skia(128): gSystemFonts[0] fileName=Roboto-Regular.ttf
05-05 00:45:19.093: D/skia(128):        name[0]=sans-serif
05-05 00:45:19.093: D/skia(128):        name[1]=arial
05-05 00:45:19.093: D/skia(128):        name[2]=helvetica
05-05 00:45:19.093: D/skia(128):        name[3]=tahoma
05-05 00:45:19.093: D/skia(128):        name[4]=verdana
05-05 00:45:19.093: D/skia(128): gSystemFonts[1] fileName=Roboto-Bold.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[2] fileName=Roboto-Italic.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[3] fileName=Roboto-BoldItalic.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[4] fileName=Roboto-Light.ttf
05-05 00:45:19.093: D/skia(128):        name[0]=sans-serif-light
05-05 00:45:19.093: D/skia(128): gSystemFonts[5] fileName=Roboto-LightItalic.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[6] fileName=Roboto-Thin.ttf
05-05 00:45:19.093: D/skia(128):        name[0]=sans-serif-thin
05-05 00:45:19.093: D/skia(128): gSystemFonts[7] fileName=Roboto-ThinItalic.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[8] fileName=RobotoCondensed-Regular.ttf
05-05 00:45:19.093: D/skia(128):        name[0]=sans-serif-condensed
05-05 00:45:19.093: D/skia(128): gSystemFonts[9] fileName=RobotoCondensed-Bold.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[10] fileName=RobotoCondensed-Italic.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[11] fileName=RobotoCondensed-BoldItalic.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[12] fileName=DroidSerif-Regular.ttf
05-05 00:45:19.093: D/skia(128):        name[0]=serif
05-05 00:45:19.093: D/skia(128):        name[1]=times
05-05 00:45:19.093: D/skia(128):        name[2]=times new roman
05-05 00:45:19.093: D/skia(128):        name[3]=palatino
05-05 00:45:19.093: D/skia(128):        name[4]=georgia
05-05 00:45:19.093: D/skia(128):        name[5]=baskerville
05-05 00:45:19.093: D/skia(128):        name[6]=goudy
05-05 00:45:19.093: D/skia(128):        name[7]=fantasy
05-05 00:45:19.093: D/skia(128):        name[8]=cursive
05-05 00:45:19.093: D/skia(128):        name[9]=ITC Stone Serif
05-05 00:45:19.093: D/skia(128): gSystemFonts[13] fileName=DroidSerif-Bold.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[14] fileName=DroidSerif-Italic.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[15] fileName=DroidSerif-BoldItalic.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[16] fileName=DroidSans.ttf
05-05 00:45:19.093: D/skia(128):        name[0]=Droid Sans
05-05 00:45:19.093: D/skia(128): gSystemFonts[17] fileName=DroidSans-Bold.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[18] fileName=DroidSansMono.ttf
05-05 00:45:19.093: D/skia(128):        name[0]=monospace
05-05 00:45:19.093: D/skia(128):        name[1]=courier
05-05 00:45:19.093: D/skia(128):        name[2]=courier new
05-05 00:45:19.093: D/skia(128):        name[3]=monaco
05-05 00:45:19.093: D/skia(128): gSystemFonts[19] fileName=DroidNaskh-Regular.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[20] fileName=DroidNaskh-Regular-SystemUI.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[21] fileName=DroidSansEthiopic-Regular.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[22] fileName=DroidSansHebrew-Regular.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[23] fileName=DroidSansHebrew-Bold.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[24] fileName=DroidSansThai.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[25] fileName=DroidSansArmenian.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[26] fileName=DroidSansGeorgian.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[27] fileName=DroidSansDevanagari-Regular.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[28] fileName=DroidSansTamil-Regular.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[29] fileName=DroidSansTamil-Bold.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[30] fileName=AnjaliNewLipi-light.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[31] fileName=Lohit-Bengali.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[32] fileName=Lohit-Kannada.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[33] fileName=NanumGothic.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[34] fileName=AndroidEmoji.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[35] fileName=Lohit-Telugu.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[36] fileName=DroidSansFallback.ttf
05-05 00:45:19.093: D/skia(128): gSystemFonts[37] fileName=MTLmr3m.ttf
05-05 00:45:19.093: D/skia(128): gFamilyHead[0]=0x41864f00 fFaces={38,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[1]=0x41864410 fFaces={37,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[2]=0x400add80 fFaces={36,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[3]=0x41864020 fFaces={35,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[4]=0x41864f80 fFaces={34,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[5]=0x400aee58 fFaces={33,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[6]=0x41864fc0 fFaces={32,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[7]=0x4185f628 fFaces={0,0,31,0} refCnt={0,0,1,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[8]=0x41864040 fFaces={29,30,0,0} refCnt={1,1,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[9]=0x41864b58 fFaces={28,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[10]=0x418e2440 fFaces={27,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[11]=0x418e27a8 fFaces={26,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[12]=0x5a569f40 fFaces={25,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[13]=0x5a569e20 fFaces={23,24,0,0} refCnt={1,1,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[14]=0x418e3510 fFaces={22,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[15]=0x400ad280 fFaces={21,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[16]=0x400adb48 fFaces={20,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[17]=0x400ad1d8 fFaces={19,0,0,0} refCnt={1,0,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[18]=0x400ad2f0 fFaces={17,18,0,0} refCnt={1,1,0,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[19]=0x400ad190 fFaces={13,14,15,16} refCnt={1,1,1,1}
05-05 00:45:19.093: D/skia(128): gFamilyHead[20]=0x400ad4f8 fFaces={9,10,11,12} refCnt={1,1,1,1}
05-05 00:45:19.093: D/skia(128): gFamilyHead[21]=0x400ad5d8 fFaces={7,0,8,0} refCnt={1,0,1,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[22]=0x400ad6a8 fFaces={5,0,6,0} refCnt={1,0,1,0}
05-05 00:45:19.093: D/skia(128): gFamilyHead[23]=0x400ad8b0 fFaces={1,2,3,4} refCnt={1,1,1,1}