18ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com/* 28ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com * Copyright 2012 Google Inc. 38ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com * 48ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com * Use of this source code is governed by a BSD-style license that can be 58ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com * found in the LICENSE file. 68ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com */ 78ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com 8a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com#include "SkData.h" 9a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com#include "SkEndian.h" 10a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com#include "SkSFNTHeader.h" 11a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com#include "SkStream.h" 12a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com#include "SkOTTable_head.h" 13a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com#include "SkOTTable_name.h" 148ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com#include "SkOTTableTypes.h" 158ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com#include "SkOTUtils.h" 168ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com 17a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.comextern const uint8_t SK_OT_GlyphData_NoOutline[] = { 18a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com 0x0,0x0, //SkOTTableGlyphData::numberOfContours 19a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com 0x0,0x0, //SkOTTableGlyphData::xMin 20a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com 0x0,0x0, //SkOTTableGlyphData::yMin 21a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com 0x0,0x0, //SkOTTableGlyphData::xMax 22a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com 0x0,0x0, //SkOTTableGlyphData::yMax 23b0a327e9390da5865d4c56db5e5259adc3380d37skia.committer@gmail.com 24a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com 0x0,0x0, //SkOTTableGlyphDataInstructions::length 25a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com}; 26a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com 278ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.comuint32_t SkOTUtils::CalcTableChecksum(SK_OT_ULONG *data, size_t length) { 288ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com uint32_t sum = 0; 298ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com SK_OT_ULONG *dataEnd = data + ((length + 3) & ~3) / sizeof(SK_OT_ULONG); 308ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com for (; data < dataEnd; ++data) { 318ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com sum += SkEndian_SwapBE32(*data); 328ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com } 338ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com return sum; 348ec9956bdfc173132de52acf1aa03746fabca287bungeman@google.com} 35a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 36a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.comSkData* SkOTUtils::RenameFont(SkStream* fontData, const char* fontName, int fontNameLen) { 37a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 38a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com // Get the sfnt header. 39a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com SkSFNTHeader sfntHeader; 40a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com if (fontData->read(&sfntHeader, sizeof(sfntHeader)) < sizeof(sfntHeader)) { 41a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com return NULL; 42a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 43a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 44a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com // Find the existing 'name' table. 45a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com int tableIndex; 46a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com SkSFNTHeader::TableDirectoryEntry tableEntry; 47a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com int numTables = SkEndian_SwapBE16(sfntHeader.numTables); 48a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com for (tableIndex = 0; tableIndex < numTables; ++tableIndex) { 49a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com if (fontData->read(&tableEntry, sizeof(tableEntry)) < sizeof(tableEntry)) { 50a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com return NULL; 51a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 52ec95a4ae45e9bff1a92627372fd771b389813fecbungeman@google.com if (SkOTTableName::TAG == tableEntry.tag) { 53a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com break; 54a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 55a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 56a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com if (tableIndex == numTables) { 57a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com return NULL; 58a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 59a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 60a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com if (!fontData->rewind()) { 61a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com return NULL; 62a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 63a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 64a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com // The required 'name' record types: Family, Style, Unique, Full and PostScript. 6507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com const SkOTTableName::Record::NameID::Predefined::Value namesToCreate[] = { 6607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com SkOTTableName::Record::NameID::Predefined::FontFamilyName, 6707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com SkOTTableName::Record::NameID::Predefined::FontSubfamilyName, 6807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com SkOTTableName::Record::NameID::Predefined::UniqueFontIdentifier, 6907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com SkOTTableName::Record::NameID::Predefined::FullFontName, 7007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com SkOTTableName::Record::NameID::Predefined::PostscriptName, 71a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com }; 72a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com const int namesCount = SK_ARRAY_COUNT(namesToCreate); 73a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 74a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com // Copy the data, leaving out the old name table. 75a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com // In theory, we could also remove the DSIG table if it exists. 7607a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com size_t nameTableLogicalSize = sizeof(SkOTTableName) + (namesCount * sizeof(SkOTTableName::Record)) + (fontNameLen * sizeof(wchar_t)); 77a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com size_t nameTablePhysicalSize = (nameTableLogicalSize + 3) & ~3; // Rounded up to a multiple of 4. 78a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 79a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com size_t oldNameTablePhysicalSize = (SkEndian_SwapBE32(tableEntry.logicalLength) + 3) & ~3; // Rounded up to a multiple of 4. 80a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com size_t oldNameTableOffset = SkEndian_SwapBE32(tableEntry.offset); 81a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 82a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com //originalDataSize is the size of the original data without the name table. 83a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com size_t originalDataSize = fontData->getLength() - oldNameTablePhysicalSize; 84a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com size_t newDataSize = originalDataSize + nameTablePhysicalSize; 85d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8633a30503d76fdd989358cedd78445ba96bb809ddreed SkAutoTUnref<SkData> rewrittenFontData(SkData::NewUninitialized(newDataSize)); 8733a30503d76fdd989358cedd78445ba96bb809ddreed SK_OT_BYTE* data = static_cast<SK_OT_BYTE*>(rewrittenFontData->writable_data()); 88a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 89a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com if (fontData->read(data, oldNameTableOffset) < oldNameTableOffset) { 90a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com return NULL; 91a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 92a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com if (fontData->skip(oldNameTablePhysicalSize) < oldNameTablePhysicalSize) { 93a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com return NULL; 94a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 95a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com if (fontData->read(data + oldNameTableOffset, originalDataSize - oldNameTableOffset) < originalDataSize - oldNameTableOffset) { 96a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com return NULL; 97a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 98a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 99a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com //Fix up the offsets of the directory entries after the old 'name' table entry. 100a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com SkSFNTHeader::TableDirectoryEntry* currentEntry = reinterpret_cast<SkSFNTHeader::TableDirectoryEntry*>(data + sizeof(SkSFNTHeader)); 101a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com SkSFNTHeader::TableDirectoryEntry* endEntry = currentEntry + numTables; 102a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com SkSFNTHeader::TableDirectoryEntry* headTableEntry = NULL; 103a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com for (; currentEntry < endEntry; ++currentEntry) { 104a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com uint32_t oldOffset = SkEndian_SwapBE32(currentEntry->offset); 105a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com if (oldOffset > oldNameTableOffset) { 106f117781362ecf673f43f93918781853690f0e145commit-bot@chromium.org currentEntry->offset = SkEndian_SwapBE32(SkToU32(oldOffset - oldNameTablePhysicalSize)); 107a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 108caa3a3beb6fecc37f24a84db0aff765480e6327bbungeman@google.com if (SkOTTableHead::TAG == currentEntry->tag) { 109a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com headTableEntry = currentEntry; 110a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 111a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 112a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 113a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com // Make the table directory entry point to the new 'name' table. 114a544f29496758de6ed2ebf5a53558574019c9da1bungeman@google.com SkSFNTHeader::TableDirectoryEntry* nameTableEntry = reinterpret_cast<SkSFNTHeader::TableDirectoryEntry*>(data + sizeof(SkSFNTHeader)) + tableIndex; 115f117781362ecf673f43f93918781853690f0e145commit-bot@chromium.org nameTableEntry->logicalLength = SkEndian_SwapBE32(SkToU32(nameTableLogicalSize)); 116f117781362ecf673f43f93918781853690f0e145commit-bot@chromium.org nameTableEntry->offset = SkEndian_SwapBE32(SkToU32(originalDataSize)); 117a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 118a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com // Write the new 'name' table after the original font data. 119a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com SkOTTableName* nameTable = reinterpret_cast<SkOTTableName*>(data + originalDataSize); 12007a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com unsigned short stringOffset = sizeof(SkOTTableName) + (namesCount * sizeof(SkOTTableName::Record)); 121a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com nameTable->format = SkOTTableName::format_0; 122a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com nameTable->count = SkEndian_SwapBE16(namesCount); 123a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com nameTable->stringOffset = SkEndian_SwapBE16(stringOffset); 124a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 12507a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com SkOTTableName::Record* nameRecords = reinterpret_cast<SkOTTableName::Record*>(data + originalDataSize + sizeof(SkOTTableName)); 126a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com for (int i = 0; i < namesCount; ++i) { 12707a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com nameRecords[i].platformID.value = SkOTTableName::Record::PlatformID::Windows; 12807a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com nameRecords[i].encodingID.windows.value = SkOTTableName::Record::EncodingID::Windows::UnicodeBMPUCS2; 12907a69f848cd6e28e0870ac9eeeba2d05f8e8d8bebungeman@google.com nameRecords[i].languageID.windows.value = SkOTTableName::Record::LanguageID::Windows::English_UnitedStates; 130a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com nameRecords[i].nameID.predefined.value = namesToCreate[i]; 131a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com nameRecords[i].offset = SkEndian_SwapBE16(0); 132a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com nameRecords[i].length = SkEndian_SwapBE16(fontNameLen * sizeof(wchar_t)); 133a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 134a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 135a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com SK_OT_USHORT* nameString = reinterpret_cast<SK_OT_USHORT*>(data + originalDataSize + stringOffset); 136a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com for (int i = 0; i < fontNameLen; ++i) { 137a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com nameString[i] = SkEndian_SwapBE16(fontName[i]); 138a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 139a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 140a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com unsigned char* logical = data + originalDataSize + nameTableLogicalSize; 141a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com unsigned char* physical = data + originalDataSize + nameTablePhysicalSize; 142a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com for (; logical < physical; ++logical) { 143a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com *logical = 0; 144a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 145a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 146a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com // Update the table checksum in the directory entry. 147a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com nameTableEntry->checksum = SkEndian_SwapBE32(SkOTUtils::CalcTableChecksum(reinterpret_cast<SK_OT_ULONG*>(nameTable), nameTableLogicalSize)); 148a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 149a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com // Update the checksum adjustment in the head table. 150a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com if (headTableEntry) { 151a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com size_t headTableOffset = SkEndian_SwapBE32(headTableEntry->offset); 152a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com if (headTableOffset + sizeof(SkOTTableHead) < originalDataSize) { 153a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com SkOTTableHead* headTable = reinterpret_cast<SkOTTableHead*>(data + headTableOffset); 154a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com headTable->checksumAdjustment = SkEndian_SwapBE32(0); 155a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com uint32_t unadjustedFontChecksum = SkOTUtils::CalcTableChecksum(reinterpret_cast<SK_OT_ULONG*>(data), originalDataSize + nameTablePhysicalSize); 156a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com headTable->checksumAdjustment = SkEndian_SwapBE32(SkOTTableHead::fontChecksum - unadjustedFontChecksum); 157a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 158a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com } 159a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com 160a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com return rewrittenFontData.detach(); 161a550199c6f37e1b05a386ea57eee4c40cc91d84dbungeman@google.com} 162a980269c2498836101146adc729ef780fb89824ebungeman@google.com 163a980269c2498836101146adc729ef780fb89824ebungeman@google.com 164a980269c2498836101146adc729ef780fb89824ebungeman@google.comSkOTUtils::LocalizedStrings_NameTable* 165a980269c2498836101146adc729ef780fb89824ebungeman@google.comSkOTUtils::LocalizedStrings_NameTable::CreateForFamilyNames(const SkTypeface& typeface) { 166a980269c2498836101146adc729ef780fb89824ebungeman@google.com static const SkFontTableTag nameTag = SkSetFourByteTag('n','a','m','e'); 167a980269c2498836101146adc729ef780fb89824ebungeman@google.com size_t nameTableSize = typeface.getTableSize(nameTag); 168a980269c2498836101146adc729ef780fb89824ebungeman@google.com if (0 == nameTableSize) { 169a980269c2498836101146adc729ef780fb89824ebungeman@google.com return NULL; 170a980269c2498836101146adc729ef780fb89824ebungeman@google.com } 171a980269c2498836101146adc729ef780fb89824ebungeman@google.com SkAutoTDeleteArray<uint8_t> nameTableData(new uint8_t[nameTableSize]); 172a980269c2498836101146adc729ef780fb89824ebungeman@google.com size_t copied = typeface.getTableData(nameTag, 0, nameTableSize, nameTableData.get()); 173a980269c2498836101146adc729ef780fb89824ebungeman@google.com if (copied != nameTableSize) { 174a980269c2498836101146adc729ef780fb89824ebungeman@google.com return NULL; 175a980269c2498836101146adc729ef780fb89824ebungeman@google.com } 176a980269c2498836101146adc729ef780fb89824ebungeman@google.com 177a980269c2498836101146adc729ef780fb89824ebungeman@google.com return new SkOTUtils::LocalizedStrings_NameTable((SkOTTableName*)nameTableData.detach(), 178a980269c2498836101146adc729ef780fb89824ebungeman@google.com SkOTUtils::LocalizedStrings_NameTable::familyNameTypes, 179a980269c2498836101146adc729ef780fb89824ebungeman@google.com SK_ARRAY_COUNT(SkOTUtils::LocalizedStrings_NameTable::familyNameTypes)); 180a980269c2498836101146adc729ef780fb89824ebungeman@google.com} 181a980269c2498836101146adc729ef780fb89824ebungeman@google.com 182a980269c2498836101146adc729ef780fb89824ebungeman@google.combool SkOTUtils::LocalizedStrings_NameTable::next(SkTypeface::LocalizedString* localizedString) { 183a980269c2498836101146adc729ef780fb89824ebungeman@google.com do { 184a980269c2498836101146adc729ef780fb89824ebungeman@google.com SkOTTableName::Iterator::Record record; 185a980269c2498836101146adc729ef780fb89824ebungeman@google.com if (fFamilyNameIter.next(record)) { 186a980269c2498836101146adc729ef780fb89824ebungeman@google.com localizedString->fString = record.name; 187a980269c2498836101146adc729ef780fb89824ebungeman@google.com localizedString->fLanguage = record.language; 188a980269c2498836101146adc729ef780fb89824ebungeman@google.com return true; 189a980269c2498836101146adc729ef780fb89824ebungeman@google.com } 190a980269c2498836101146adc729ef780fb89824ebungeman@google.com if (fTypesCount == fTypesIndex + 1) { 191a980269c2498836101146adc729ef780fb89824ebungeman@google.com return false; 192a980269c2498836101146adc729ef780fb89824ebungeman@google.com } 193a980269c2498836101146adc729ef780fb89824ebungeman@google.com ++fTypesIndex; 194a980269c2498836101146adc729ef780fb89824ebungeman@google.com fFamilyNameIter.reset(fTypes[fTypesIndex]); 195a980269c2498836101146adc729ef780fb89824ebungeman@google.com } while (true); 196a980269c2498836101146adc729ef780fb89824ebungeman@google.com} 197a980269c2498836101146adc729ef780fb89824ebungeman@google.com 198a980269c2498836101146adc729ef780fb89824ebungeman@google.comSkOTTableName::Record::NameID::Predefined::Value 199a980269c2498836101146adc729ef780fb89824ebungeman@google.comSkOTUtils::LocalizedStrings_NameTable::familyNameTypes[3] = { 200a980269c2498836101146adc729ef780fb89824ebungeman@google.com SkOTTableName::Record::NameID::Predefined::FontFamilyName, 201a980269c2498836101146adc729ef780fb89824ebungeman@google.com SkOTTableName::Record::NameID::Predefined::PreferredFamily, 202a980269c2498836101146adc729ef780fb89824ebungeman@google.com SkOTTableName::Record::NameID::Predefined::WWSFamilyName, 203a980269c2498836101146adc729ef780fb89824ebungeman@google.com}; 204