virtual ~FontConfigTypeface() { const uint32_t id = uniqueID(); if (IsRemoteFont(UniqueIdToFileFaceId(id))) { SkAutoMutexAcquire ac(global_remote_font_map_lock); AllocateGlobalRemoteFontsMapOnce(); std::map<uint32_t, std::pair<uint8_t*, size_t> >::iterator iter = global_remote_fonts->find(id); if (iter != global_remote_fonts->end()) { sk_free(iter->second.first); // remove the font on memory. global_remote_fonts->erase(iter); } } }
// static size_t SkFontHost::GetFileName(SkFontID fontID, char path[], size_t length, int32_t* index) { const unsigned filefaceid = UniqueIdToFileFaceId(fontID); if (IsRemoteFont(filefaceid)) return 0; if (index) { *index = filefaceid & 0xfu; // 1 is a bogus return value. // We had better change the signature of this function in Skia // to return bool to indicate success/failure and have another // out param for fileName length. if (!path) return 1; } if (path) SkASSERT(!"SkFontHost::GetFileName does not support the font path " "retrieval."); return 0; }
// static SkStream* SkFontHost::OpenStream(uint32_t id) { const unsigned filefaceid = UniqueIdToFileFaceId(id); if (IsRemoteFont(filefaceid)) { // remote font SkAutoMutexAcquire ac(global_remote_font_map_lock); AllocateGlobalRemoteFontsMapOnce(); std::map<uint32_t, std::pair<uint8_t*, size_t> >::const_iterator iter = global_remote_fonts->find(id); if (iter == global_remote_fonts->end()) return NULL; return SkNEW_ARGS( SkMemoryStream, (iter->second.first, iter->second.second)); } // system font const int fd = GetFcImpl()->Open(filefaceid); if (fd < 0) return NULL; return SkNEW_ARGS(SkFileDescriptorStream, (fd)); }