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}