@@ -65,18 +65,25 @@ SkData* SkOTUtils::RenameFont(SkStreamAsset* fontData, const char* fontName, int
6565 }
6666
6767 // The required 'name' record types: Family, Style, Unique, Full and PostScript.
68- const SkOTTableName::Record::NameID::Predefined::Value namesToCreate[] = {
68+ static constexpr std::array< SkOTTableName::Record::NameID::Predefined::Value, 5 > names{ {
6969 SkOTTableName::Record::NameID::Predefined::FontFamilyName,
7070 SkOTTableName::Record::NameID::Predefined::FontSubfamilyName,
7171 SkOTTableName::Record::NameID::Predefined::UniqueFontIdentifier,
7272 SkOTTableName::Record::NameID::Predefined::FullFontName,
7373 SkOTTableName::Record::NameID::Predefined::PostscriptName,
74- };
75- const int namesCount = SK_ARRAY_COUNT (namesToCreate);
74+ }};
75+
76+ // GDI will not use a Symbol cmap table if there is no Symbol encoded name.
77+ static constexpr std::array<SkOTTableName::Record::EncodingID::Windows::Value, 2 > encodings{{
78+ SkOTTableName::Record::EncodingID::Windows::Symbol,
79+ SkOTTableName::Record::EncodingID::Windows::UnicodeBMPUCS2,
80+ }};
7681
7782 // Copy the data, leaving out the old name table.
7883 // In theory, we could also remove the DSIG table if it exists.
79- size_t nameTableLogicalSize = sizeof (SkOTTableName) + (namesCount * sizeof (SkOTTableName::Record)) + (fontNameLen * sizeof (wchar_t ));
84+ size_t nameTableLogicalSize = sizeof (SkOTTableName)
85+ + (encodings.size () * names.size () * sizeof (SkOTTableName::Record))
86+ + (fontNameLen * sizeof (SK_OT_USHORT));
8087 size_t nameTablePhysicalSize = (nameTableLogicalSize + 3 ) & ~3 ; // Rounded up to a multiple of 4.
8188
8289 size_t oldNameTablePhysicalSize = (SkEndian_SwapBE32 (tableEntry.logicalLength ) + 3 ) & ~3 ; // Rounded up to a multiple of 4.
@@ -108,6 +115,7 @@ SkData* SkOTUtils::RenameFont(SkStreamAsset* fontData, const char* fontName, int
108115 if (oldOffset > oldNameTableOffset) {
109116 currentEntry->offset = SkEndian_SwapBE32 (SkToU32 (oldOffset - oldNameTablePhysicalSize));
110117 }
118+
111119 if (SkOTTableHead::TAG == currentEntry->tag ) {
112120 headTableEntry = currentEntry;
113121 }
@@ -120,19 +128,22 @@ SkData* SkOTUtils::RenameFont(SkStreamAsset* fontData, const char* fontName, int
120128
121129 // Write the new 'name' table after the original font data.
122130 SkOTTableName* nameTable = reinterpret_cast <SkOTTableName*>(data + originalDataSize);
123- unsigned short stringOffset = sizeof (SkOTTableName) + (namesCount * sizeof (SkOTTableName::Record));
131+ unsigned short stringOffset = sizeof (SkOTTableName) + (encodings. size () * names. size () * sizeof (SkOTTableName::Record));
124132 nameTable->format = SkOTTableName::format_0;
125- nameTable->count = SkEndian_SwapBE16 (namesCount );
133+ nameTable->count = SkEndian_SwapBE16 (encodings. size () * names. size () );
126134 nameTable->stringOffset = SkEndian_SwapBE16 (stringOffset);
127135
128- SkOTTableName::Record* nameRecords = reinterpret_cast <SkOTTableName::Record*>(data + originalDataSize + sizeof (SkOTTableName));
129- for (int i = 0 ; i < namesCount; ++i) {
130- nameRecords[i].platformID .value = SkOTTableName::Record::PlatformID::Windows;
131- nameRecords[i].encodingID .windows .value = SkOTTableName::Record::EncodingID::Windows::UnicodeBMPUCS2;
132- nameRecords[i].languageID .windows .value = SkOTTableName::Record::LanguageID::Windows::English_UnitedStates;
133- nameRecords[i].nameID .predefined .value = namesToCreate[i];
134- nameRecords[i].offset = SkEndian_SwapBE16 (0 );
135- nameRecords[i].length = SkEndian_SwapBE16 (SkToU16 (fontNameLen * sizeof (wchar_t )));
136+ SkOTTableName::Record* nameRecord = reinterpret_cast <SkOTTableName::Record*>(data + originalDataSize + sizeof (SkOTTableName));
137+ for (const auto & encoding : encodings) {
138+ for (const auto & name : names) {
139+ nameRecord->platformID .value = SkOTTableName::Record::PlatformID::Windows;
140+ nameRecord->encodingID .windows .value = encoding;
141+ nameRecord->languageID .windows .value = SkOTTableName::Record::LanguageID::Windows::English_UnitedStates;
142+ nameRecord->nameID .predefined .value = name;
143+ nameRecord->offset = SkEndian_SwapBE16 (0 );
144+ nameRecord->length = SkEndian_SwapBE16 (SkToU16 (fontNameLen * sizeof (SK_OT_USHORT)));
145+ ++nameRecord;
146+ }
136147 }
137148
138149 SK_OT_USHORT* nameString = reinterpret_cast <SK_OT_USHORT*>(data + originalDataSize + stringOffset);
0 commit comments