Skip to content

Commit 1dac7bc

Browse files
Ben WagnerSkia Commit-Bot
authored andcommitted
Add Symbol encoding when renaming a font.
GDI will not use a Symbol encoded cmap table if there is no Symbol encoded name. Always output both Unicode and Symbol names (same data, different name entries). This fixes test_symbolfont on GDI. Change-Id: I05dea903b9c3914a852cf31472a19a6a06b274e0 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/233079 Commit-Queue: Ben Wagner <bungeman@google.com> Reviewed-by: Herb Derby <herb@google.com>
1 parent cd30375 commit 1dac7bc

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

src/sfnt/SkOTUtils.cpp

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)