diff options
-rw-r--r-- | resources/fonts/7630.otf | bin | 0 -> 1168 bytes | |||
-rw-r--r-- | src/ports/SkFontHost_mac.cpp | 17 | ||||
-rw-r--r-- | tests/TypefaceTest.cpp | 15 |
3 files changed, 31 insertions, 1 deletions
diff --git a/resources/fonts/7630.otf b/resources/fonts/7630.otf Binary files differnew file mode 100644 index 0000000000..355d0af275 --- /dev/null +++ b/resources/fonts/7630.otf diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp index ae46664ff6..5d8723b95f 100644 --- a/src/ports/SkFontHost_mac.cpp +++ b/src/ports/SkFontHost_mac.cpp @@ -1629,15 +1629,30 @@ SkStreamAsset* SkTypeface_Mac::onOpenStream(int* ttcIndex) const { tableTags.setCount(numTables); this->getTableTags(tableTags.begin()); - // calc total size for font, save sizes + // see if there are any required 'typ1' tables (see Adobe Technical Note #5180) + bool couldBeTyp1 = false; + constexpr SkFontTableTag TYPE1Tag = SkSetFourByteTag('T', 'Y', 'P', '1'); + constexpr SkFontTableTag CIDTag = SkSetFourByteTag('C', 'I', 'D', ' '); + // get the table sizes and accumulate the total size of the font SkTDArray<size_t> tableSizes; size_t totalSize = sizeof(SkSFNTHeader) + sizeof(SkSFNTHeader::TableDirectoryEntry) * numTables; for (int tableIndex = 0; tableIndex < numTables; ++tableIndex) { + if (TYPE1Tag == tableTags[tableIndex] || CIDTag == tableTags[tableIndex]) { + couldBeTyp1 = true; + } + size_t tableSize = this->getTableSize(tableTags[tableIndex]); totalSize += (tableSize + 3) & ~3; *tableSizes.append() = tableSize; } + // sometimes CoreGraphics incorrectly thinks a font is kCTFontFormatPostScript + // it is exceedingly unlikely that this is the case, so double check + // see https://crbug.com/809763 + if (fontType == SkSFNTHeader::fontType_PostScript::TAG && !couldBeTyp1) { + fontType = SkSFNTHeader::fontType_OpenTypeCFF::TAG; + } + // reserve memory for stream, and zero it (tables must be zero padded) SkMemoryStream* stream = new SkMemoryStream(totalSize); char* dataStart = (char*)stream->getMemoryBase(); diff --git a/tests/TypefaceTest.cpp b/tests/TypefaceTest.cpp index fc81e84926..b6b71aeb8c 100644 --- a/tests/TypefaceTest.cpp +++ b/tests/TypefaceTest.cpp @@ -94,6 +94,21 @@ DEF_TEST(TypefaceStyle, reporter) { } } +DEF_TEST(TypefaceRoundTrip, reporter) { + sk_sp<SkTypeface> typeface(MakeResourceAsTypeface("fonts/7630.otf")); + if (!typeface) { + // Not all SkFontMgr can MakeFromStream(). + return; + } + + int fontIndex; + std::unique_ptr<SkStreamAsset> stream(typeface->openStream(&fontIndex)); + + sk_sp<SkFontMgr> fm = SkFontMgr::RefDefault(); + sk_sp<SkTypeface> typeface2 = fm->makeFromStream(std::move(stream), fontIndex); + REPORTER_ASSERT(reporter, typeface2); +} + DEF_TEST(TypefaceAxes, reporter) { std::unique_ptr<SkStreamAsset> distortable(GetResourceAsStream("fonts/Distortable.ttf")); if (!distortable) { |