diff options
author | 2013-12-10 16:32:06 +0000 | |
---|---|---|
committer | 2013-12-10 16:32:06 +0000 | |
commit | 47fb2b9c67c2c4c464e8eb05e9b7877cfb1636aa (patch) | |
tree | d6c5d0df49c6621e109ee5dbaf3bbefcb005667f | |
parent | e167b11fb5e74a34398172c6cb7874df9c6e0fe7 (diff) |
[PDF] Fix font embedding restrictions.
Stop using restricted font outlines and honor don't subset restriction.
R=reed@google.com, bungeman@google.com
Author: vandebo@chromium.org
Review URL: https://codereview.chromium.org/107863002
git-svn-id: http://skia.googlecode.com/svn/trunk@12600 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | gyp/core.gyp | 1 | ||||
-rwxr-xr-x | include/core/SkAdvancedTypefaceMetrics.h | 16 | ||||
-rw-r--r-- | include/pdf/SkPDFDocument.h | 10 | ||||
-rw-r--r-- | src/core/SkTypeface.cpp | 23 | ||||
-rw-r--r-- | src/pdf/SkPDFDocument.cpp | 46 | ||||
-rw-r--r-- | src/pdf/SkPDFFont.cpp | 85 | ||||
-rw-r--r-- | src/pdf/SkPDFFont.h | 13 | ||||
-rw-r--r-- | src/ports/SkFontHost_FreeType.cpp | 36 | ||||
-rwxr-xr-x | src/ports/SkFontHost_mac.cpp | 10 | ||||
-rwxr-xr-x | src/ports/SkFontHost_win.cpp | 18 | ||||
-rw-r--r-- | src/ports/SkFontHost_win_dw.cpp | 10 |
11 files changed, 203 insertions, 65 deletions
diff --git a/gyp/core.gyp b/gyp/core.gyp index 868abea646..a74f0b2d52 100644 --- a/gyp/core.gyp +++ b/gyp/core.gyp @@ -23,6 +23,7 @@ '../include/xml', '../src/core', '../src/opts', + '../src/sfnt', '../src/image', ], 'sources': [ diff --git a/include/core/SkAdvancedTypefaceMetrics.h b/include/core/SkAdvancedTypefaceMetrics.h index e75365ba31..11926888f5 100755 --- a/include/core/SkAdvancedTypefaceMetrics.h +++ b/include/core/SkAdvancedTypefaceMetrics.h @@ -35,15 +35,21 @@ public: kCFF_Font, kTrueType_Font, kOther_Font, - kNotEmbeddable_Font }; // The type of the underlying font program. This field determines which - // of the following fields are valid. If it is kOther_Font or - // kNotEmbeddable_Font, the per glyph information will never be populated. + // of the following fields are valid. If it is kOther_Font the per glyph + // information will never be populated. FontType fType; - // fMultiMaster may be true for Type1_Font or CFF_Font. - bool fMultiMaster; + enum FontFlags { + kEmpty_FontFlag = 0x0, //!<No flags set + kMultiMaster_FontFlag = 0x1, //!<May be true for Type1 or CFF fonts. + kNotEmbeddable_FontFlag = 0x2, //!<May not be embedded. + kNotSubsettable_FontFlag = 0x4, //!<May not be subset. + }; + // Global font flags. + FontFlags fFlags; + uint16_t fLastGlyphID; // The last valid glyph ID in the font. uint16_t fEmSize; // The size of the em box (defines font units). diff --git a/include/pdf/SkPDFDocument.h b/include/pdf/SkPDFDocument.h index 9f651fdced..07738a210b 100644 --- a/include/pdf/SkPDFDocument.h +++ b/include/pdf/SkPDFDocument.h @@ -69,9 +69,17 @@ public: SK_API bool appendPage(SkPDFDevice* pdfDevice); /** Get the count of unique font types used in the document. + * DEPRECATED. */ SK_API void getCountOfFontTypes( - int counts[SkAdvancedTypefaceMetrics::kNotEmbeddable_Font + 1]) const; + int counts[SkAdvancedTypefaceMetrics::kOther_Font + 2]) const; + + /** Get the count of unique font types used in the document. + */ + SK_API void getCountOfFontTypes( + int counts[SkAdvancedTypefaceMetrics::kOther_Font + 1], + int* notSubsettableCount, + int* notEmbedddableCount) const; private: SkAutoTDelete<SkPDFCatalog> fCatalog; diff --git a/src/core/SkTypeface.cpp b/src/core/SkTypeface.cpp index 09a64324af..e419391b2d 100644 --- a/src/core/SkTypeface.cpp +++ b/src/core/SkTypeface.cpp @@ -6,8 +6,10 @@ */ #include "SkAdvancedTypefaceMetrics.h" +#include "SkEndian.h" #include "SkFontDescriptor.h" #include "SkFontHost.h" +#include "SkOTTable_OS_2.h" #include "SkStream.h" #include "SkTypeface.h" @@ -259,7 +261,26 @@ SkAdvancedTypefaceMetrics* SkTypeface::getAdvancedTypefaceMetrics( SkAdvancedTypefaceMetrics::PerGlyphInfo info, const uint32_t* glyphIDs, uint32_t glyphIDsCount) const { - return this->onGetAdvancedTypefaceMetrics(info, glyphIDs, glyphIDsCount); + SkAdvancedTypefaceMetrics* result = + this->onGetAdvancedTypefaceMetrics(info, glyphIDs, glyphIDsCount); + if (result && result->fType == SkAdvancedTypefaceMetrics::kTrueType_Font) { + struct SkOTTableOS2 os2table; + if (this->getTableData(SkEndian_SwapBE32(SkOTTableOS2::TAG), 0, + sizeof(os2table), &os2table) > 0) { + if (os2table.version.v2.fsType.field.Restricted || + os2table.version.v2.fsType.field.Bitmap) { + result->fFlags = SkTBitOr<SkAdvancedTypefaceMetrics::FontFlags>( + result->fFlags, + SkAdvancedTypefaceMetrics::kNotEmbeddable_FontFlag); + } + if (os2table.version.v2.fsType.field.NoSubsetting) { + result->fFlags = SkTBitOr<SkAdvancedTypefaceMetrics::FontFlags>( + result->fFlags, + SkAdvancedTypefaceMetrics::kNotSubsettable_FontFlag); + } + } + } + return result; } /////////////////////////////////////////////////////////////////////////////// diff --git a/src/pdf/SkPDFDocument.cpp b/src/pdf/SkPDFDocument.cpp index 0633d30828..79699a0292 100644 --- a/src/pdf/SkPDFDocument.cpp +++ b/src/pdf/SkPDFDocument.cpp @@ -258,11 +258,13 @@ bool SkPDFDocument::appendPage(SkPDFDevice* pdfDevice) { return true; } +// Deprecated. void SkPDFDocument::getCountOfFontTypes( - int counts[SkAdvancedTypefaceMetrics::kNotEmbeddable_Font + 1]) const { + int counts[SkAdvancedTypefaceMetrics::kOther_Font + 2]) const { sk_bzero(counts, sizeof(int) * - (SkAdvancedTypefaceMetrics::kNotEmbeddable_Font + 1)); + (SkAdvancedTypefaceMetrics::kOther_Font + 2)); SkTDArray<SkFontID> seenFonts; + int notEmbeddable = 0; for (int pageNumber = 0; pageNumber < fPages.count(); pageNumber++) { const SkTDArray<SkPDFFont*>& fontResources = @@ -272,9 +274,49 @@ void SkPDFDocument::getCountOfFontTypes( if (seenFonts.find(fontID) == -1) { counts[fontResources[font]->getType()]++; seenFonts.push(fontID); + if (!fontResources[font]->canEmbed()) { + notEmbeddable++; + } } } } + counts[SkAdvancedTypefaceMetrics::kOther_Font + 1] = notEmbeddable; +} + +void SkPDFDocument::getCountOfFontTypes( + int counts[SkAdvancedTypefaceMetrics::kOther_Font + 1], + int* notSubsettableCount, + int* notEmbeddableCount) const { + sk_bzero(counts, sizeof(int) * + (SkAdvancedTypefaceMetrics::kOther_Font + 1)); + SkTDArray<SkFontID> seenFonts; + int notSubsettable = 0; + int notEmbeddable = 0; + + for (int pageNumber = 0; pageNumber < fPages.count(); pageNumber++) { + const SkTDArray<SkPDFFont*>& fontResources = + fPages[pageNumber]->getFontResources(); + for (int font = 0; font < fontResources.count(); font++) { + SkFontID fontID = fontResources[font]->typeface()->uniqueID(); + if (seenFonts.find(fontID) == -1) { + counts[fontResources[font]->getType()]++; + seenFonts.push(fontID); + if (!fontResources[font]->canSubset()) { + notSubsettable++; + } + if (!fontResources[font]->canEmbed()) { + notEmbeddable++; + } + } + } + } + if (notSubsettableCount) { + *notSubsettableCount = notSubsettable; + + } + if (notEmbeddableCount) { + *notEmbeddableCount = notEmbeddable; + } } void SkPDFDocument::emitHeader(SkWStream* stream) { diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp index 1641a8916c..30c11d9792 100644 --- a/src/pdf/SkPDFFont.cpp +++ b/src/pdf/SkPDFFont.cpp @@ -749,6 +749,24 @@ SkAdvancedTypefaceMetrics::FontType SkPDFFont::getType() { return fFontType; } +bool SkPDFFont::canEmbed() const { + if (!fFontInfo.get()) { + SkASSERT(fFontType == SkAdvancedTypefaceMetrics::kOther_Font); + return true; + } + return (fFontInfo->fFlags & + SkAdvancedTypefaceMetrics::kNotEmbeddable_FontFlag) == 0; +} + +bool SkPDFFont::canSubset() const { + if (!fFontInfo.get()) { + SkASSERT(fFontType == SkAdvancedTypefaceMetrics::kOther_Font); + return true; + } + return (fFontInfo->fFlags & + SkAdvancedTypefaceMetrics::kNotSubsettable_FontFlag) == 0; +} + bool SkPDFFont::hasGlyph(uint16_t id) { return (id >= fFirstGlyphID && id <= fLastGlyphID) || id == 0; } @@ -797,7 +815,7 @@ SkPDFFont* SkPDFFont::GetFontResource(SkTypeface* typeface, uint16_t glyphID) { // This only is to catch callers who pass invalid glyph ids. // If glyph id is invalid, then we will create duplicate entries - // for True Type fonts. + // for TrueType fonts. SkAdvancedTypefaceMetrics::FontType fontType = fontMetrics.get() ? fontMetrics.get()->fType : SkAdvancedTypefaceMetrics::kOther_Font; @@ -877,9 +895,8 @@ SkPDFFont::SkPDFFont(SkAdvancedTypefaceMetrics* info, SkTypeface* typeface, fLastGlyphID(info ? info->fLastGlyphID : 0), fFontInfo(SkSafeRef(info)), fDescriptor(SkSafeRef(relatedFontDescriptor)) { - if (info == NULL) { - fFontType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; - } else if (info->fMultiMaster) { + if (info == NULL || + info->fFlags & SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag) { fFontType = SkAdvancedTypefaceMetrics::kOther_Font; } else { fFontType = info->fType; @@ -891,9 +908,10 @@ SkPDFFont* SkPDFFont::Create(SkAdvancedTypefaceMetrics* info, SkTypeface* typeface, uint16_t glyphID, SkPDFDict* relatedFontDescriptor) { SkAdvancedTypefaceMetrics::FontType type = - info ? info->fType : SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; + info ? info->fType : SkAdvancedTypefaceMetrics::kOther_Font; - if (info && info->fMultiMaster) { + if (info && + (info->fFlags & SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag)) { NOT_IMPLEMENTED(true, true); return new SkPDFType3Font(info, typeface, @@ -912,8 +930,7 @@ SkPDFFont* SkPDFFont::Create(SkAdvancedTypefaceMetrics* info, } SkASSERT(type == SkAdvancedTypefaceMetrics::kCFF_Font || - type == SkAdvancedTypefaceMetrics::kOther_Font || - type == SkAdvancedTypefaceMetrics::kNotEmbeddable_Font); + type == SkAdvancedTypefaceMetrics::kOther_Font); return new SkPDFType3Font(info, typeface, glyphID); } @@ -1040,11 +1057,17 @@ SkPDFType0Font::SkPDFType0Font(SkAdvancedTypefaceMetrics* info, SkTypeface* typeface) : SkPDFFont(info, typeface, NULL) { SkDEBUGCODE(fPopulated = false); + if (!canSubset()) { + populate(NULL); + } } SkPDFType0Font::~SkPDFType0Font() {} SkPDFFont* SkPDFType0Font::getFontSubset(const SkPDFGlyphSet* subset) { + if (!canSubset()) { + return NULL; + } SkPDFType0Font* newSubset = new SkPDFType0Font(fontInfo(), typeface()); newSubset->populate(subset); return newSubset; @@ -1093,19 +1116,34 @@ bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth, SkAutoTUnref<SkPDFDict> descriptor(new SkPDFDict("FontDescriptor")); setFontDescriptor(descriptor.get()); addResource(descriptor.get()); + insert("FontDescriptor", new SkPDFObjRef(descriptor.get()))->unref(); + if (!addCommonFontDescriptorEntries(defaultWidth)) { + return false; + } + if (!canEmbed()) { + return true; + } switch (getType()) { case SkAdvancedTypefaceMetrics::kTrueType_Font: { - SkASSERT(subset); - // Font subsetting - SkPDFStream* rawStream = NULL; - int fontSize = get_subset_font_stream(fontInfo()->fFontName.c_str(), + SkAutoTUnref<SkPDFStream> fontStream; + int fontSize = 0; + if (canSubset()) { + SkPDFStream* rawStream = NULL; + fontSize = get_subset_font_stream(fontInfo()->fFontName.c_str(), typeface(), *subset, &rawStream); + fontStream.reset(rawStream); + } else { + int ttcIndex; + SkAutoTUnref<SkStream> fontData( + typeface()->openStream(&ttcIndex)); + fontStream.reset(new SkPDFStream(fontData.get())); + fontSize = fontData->getLength(); + } SkASSERT(fontSize); - SkASSERT(rawStream); - SkAutoTUnref<SkPDFStream> fontStream(rawStream); + SkASSERT(fontStream.get()); addResource(fontStream.get()); fontStream->insertInt("Length1", fontSize); @@ -1133,9 +1171,7 @@ bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth, default: SkASSERT(false); } - - insert("FontDescriptor", new SkPDFObjRef(descriptor.get()))->unref(); - return addCommonFontDescriptorEntries(defaultWidth); + return true; } bool SkPDFCIDFont::populate(const SkPDFGlyphSet* subset) { @@ -1251,12 +1287,15 @@ bool SkPDFType1Font::addFontDescriptor(int16_t defaultWidth) { if (fontData == NULL) { return false; } - SkAutoTUnref<SkPDFStream> fontStream(new SkPDFStream(fontData)); - addResource(fontStream.get()); - fontStream->insertInt("Length1", header); - fontStream->insertInt("Length2", data); - fontStream->insertInt("Length3", trailer); - descriptor->insert("FontFile", new SkPDFObjRef(fontStream.get()))->unref(); + if (canEmbed()) { + SkAutoTUnref<SkPDFStream> fontStream(new SkPDFStream(fontData)); + addResource(fontStream.get()); + fontStream->insertInt("Length1", header); + fontStream->insertInt("Length2", data); + fontStream->insertInt("Length3", trailer); + descriptor->insert("FontFile", + new SkPDFObjRef(fontStream.get()))->unref(); + } addResource(descriptor.get()); insert("FontDescriptor", new SkPDFObjRef(descriptor.get()))->unref(); diff --git a/src/pdf/SkPDFFont.h b/src/pdf/SkPDFFont.h index 694c69ac39..815c73ac22 100644 --- a/src/pdf/SkPDFFont.h +++ b/src/pdf/SkPDFFont.h @@ -99,6 +99,14 @@ public: */ virtual bool multiByteGlyphs() const = 0; + /** Returns true if the machine readable licensing bits allow embedding. + */ + bool canEmbed() const; + + /** Returns true if the machine readable licensing bits allow subsetting. + */ + bool canSubset() const; + /** Return true if this font has an encoding for the passed glyph id. */ bool hasGlyph(uint16_t glyphID); @@ -121,8 +129,7 @@ public: * @param typeface The typeface to find. * @param glyphID Specify which section of a large font is of interest. */ - static SkPDFFont* GetFontResource(SkTypeface* typeface, - uint16_t glyphID); + static SkPDFFont* GetFontResource(SkTypeface* typeface, uint16_t glyphID); /** Subset the font based on usage set. Returns a SkPDFFont instance with * subset. @@ -188,8 +195,6 @@ private: // this will be a subset if the font has more than 255 glyphs. uint16_t fFirstGlyphID; uint16_t fLastGlyphID; - // The font info is only kept around after construction for large - // Type1 (non CID) fonts that need multiple "fonts" to access all glyphs. SkAutoTUnref<SkAdvancedTypefaceMetrics> fFontInfo; SkTDArray<SkPDFObject*> fResources; SkAutoTUnref<SkPDFDict> fDescriptor; diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp index fd87a66dc6..134cc052be 100644 --- a/src/ports/SkFontHost_FreeType.cpp +++ b/src/ports/SkFontHost_FreeType.cpp @@ -411,6 +411,20 @@ static bool canEmbed(FT_Face face) { #endif } +static bool canSubset(FT_Face face) { +#ifdef FT_FSTYPE_NO_SUBSETTING + FT_UShort fsType = FT_Get_FSType_Flags(face); + return (fsType & FT_FSTYPE_NO_SUBSETTING) == 0; +#else + // No subset is 0x100. + TT_OS2* os2_table; + if ((os2_table = (TT_OS2*)FT_Get_Sfnt_Table(face, ft_sfnt_os2)) != NULL) { + return (os2_table->fsType & 0x100) == 0; + } + return false; // We tried, fail safe. +#endif +} + static bool GetLetterCBox(FT_Face face, char letter, FT_BBox* bbox) { const FT_UInt glyph_id = FT_Get_Char_Index(face, letter); if (!glyph_id) @@ -495,7 +509,21 @@ SkAdvancedTypefaceMetrics* SkTypeface_FreeType::onGetAdvancedTypefaceMetrics( SkAdvancedTypefaceMetrics* info = new SkAdvancedTypefaceMetrics; info->fFontName.set(FT_Get_Postscript_Name(face)); - info->fMultiMaster = FT_HAS_MULTIPLE_MASTERS(face); + info->fFlags = SkAdvancedTypefaceMetrics::kEmpty_FontFlag; + if (FT_HAS_MULTIPLE_MASTERS(face)) { + info->fFlags = SkTBitOr<SkAdvancedTypefaceMetrics::FontFlags>( + info->fFlags, SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag); + } + if (!canEmbed(face)) { + info->fFlags = SkTBitOr<SkAdvancedTypefaceMetrics::FontFlags>( + info->fFlags, + SkAdvancedTypefaceMetrics::kNotEmbeddable_FontFlag); + } + if (!canSubset(face)) { + info->fFlags = SkTBitOr<SkAdvancedTypefaceMetrics::FontFlags>( + info->fFlags, + SkAdvancedTypefaceMetrics::kNotSubsettable_FontFlag); + } info->fLastGlyphID = face->num_glyphs - 1; info->fEmSize = 1000; @@ -588,8 +616,7 @@ SkAdvancedTypefaceMetrics* SkTypeface_FreeType::onGetAdvancedTypefaceMetrics( info->fBBox = SkIRect::MakeLTRB(face->bbox.xMin, face->bbox.yMax, face->bbox.xMax, face->bbox.yMin); - if (!canEmbed(face) || !FT_IS_SCALABLE(face) || - info->fType == SkAdvancedTypefaceMetrics::kOther_Font) { + if (!FT_IS_SCALABLE(face)) { perGlyphInfo = SkAdvancedTypefaceMetrics::kNo_PerGlyphInfo; } @@ -652,9 +679,6 @@ SkAdvancedTypefaceMetrics* SkTypeface_FreeType::onGetAdvancedTypefaceMetrics( populate_glyph_to_unicode(face, &(info->fGlyphToUnicode)); } - if (!canEmbed(face)) - info->fType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; - return info; #endif } diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp index fe3fd06981..71620478c5 100755 --- a/src/ports/SkFontHost_mac.cpp +++ b/src/ports/SkFontHost_mac.cpp @@ -1539,17 +1539,16 @@ SkAdvancedTypefaceMetrics* SkTypeface_Mac::onGetAdvancedTypefaceMetrics( CFStringToSkString(fontName, &info->fFontName); } - info->fMultiMaster = false; CFIndex glyphCount = CTFontGetGlyphCount(ctFont); info->fLastGlyphID = SkToU16(glyphCount - 1); info->fEmSize = CTFontGetUnitsPerEm(ctFont); + info->fFlags = SkAdvancedTypefaceMetrics::kEmpty_FontFlag; + info->fStyle = 0; if (perGlyphInfo & SkAdvancedTypefaceMetrics::kToUnicode_PerGlyphInfo) { populate_glyph_to_unicode(ctFont, glyphCount, &info->fGlyphToUnicode); } - info->fStyle = 0; - // If it's not a truetype font, mark it as 'other'. Assume that TrueType // fonts always have both glyf and loca tables. At the least, this is what // sfntly needs to subset the font. CTFontCopyAttribute() does not always @@ -1613,10 +1612,7 @@ SkAdvancedTypefaceMetrics* SkTypeface_Mac::onGetAdvancedTypefaceMetrics( } } - if (false) { // TODO: haven't figured out how to know if font is embeddable - // (information is in the OS/2 table) - info->fType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; - } else if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo) { + if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo) { if (info->fStyle & SkAdvancedTypefaceMetrics::kFixedPitch_Style) { skia_advanced_typeface_metrics_utils::appendRange(&info->fGlyphWidths, 0); info->fGlyphWidths->fAdvance.append(1, &min_width); diff --git a/src/ports/SkFontHost_win.cpp b/src/ports/SkFontHost_win.cpp index aee2b863e6..386c3db9fd 100755 --- a/src/ports/SkFontHost_win.cpp +++ b/src/ports/SkFontHost_win.cpp @@ -1851,10 +1851,18 @@ SkAdvancedTypefaceMetrics* LogFontTypeface::onGetAdvancedTypefaceMetrics( info = new SkAdvancedTypefaceMetrics; info->fEmSize = otm.otmEMSquare; - info->fMultiMaster = false; info->fLastGlyphID = SkToU16(glyphCount - 1); info->fStyle = 0; tchar_to_skstring(lf.lfFaceName, &info->fFontName); + info->fFlags = SkAdvancedTypefaceMetrics::kEmpty_FontFlag; + // If bit 1 is set, the font may not be embedded in a document. + // If bit 1 is clear, the font can be embedded. + // If bit 2 is set, the embedding is read-only. + if (otm.otmfsType & 0x1) { + info->fFlags = SkTBitOr<SkAdvancedTypefaceMetrics::FontFlags>( + info->fFlags, + SkAdvancedTypefaceMetrics::kNotEmbeddable_FontFlag) + } if (perGlyphInfo & SkAdvancedTypefaceMetrics::kToUnicode_PerGlyphInfo) { populate_glyph_to_unicode(hdc, glyphCount, &(info->fGlyphToUnicode)); @@ -1915,13 +1923,7 @@ SkAdvancedTypefaceMetrics* LogFontTypeface::onGetAdvancedTypefaceMetrics( } } - // If bit 1 is set, the font may not be embedded in a document. - // If bit 1 is clear, the font can be embedded. - // If bit 2 is set, the embedding is read-only. - if (otm.otmfsType & 0x1) { - info->fType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; - } else if (perGlyphInfo & - SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo) { + if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo) { if (info->fStyle & SkAdvancedTypefaceMetrics::kFixedPitch_Style) { appendRange(&info->fGlyphWidths, 0); info->fGlyphWidths->fAdvance.append(1, &min_width); diff --git a/src/ports/SkFontHost_win_dw.cpp b/src/ports/SkFontHost_win_dw.cpp index 00623623b0..3df743055a 100644 --- a/src/ports/SkFontHost_win_dw.cpp +++ b/src/ports/SkFontHost_win_dw.cpp @@ -1490,10 +1490,9 @@ SkAdvancedTypefaceMetrics* DWriteFontTypeface::onGetAdvancedTypefaceMetrics( info = new SkAdvancedTypefaceMetrics; info->fEmSize = dwfm.designUnitsPerEm; - info->fMultiMaster = false; info->fLastGlyphID = SkToU16(glyphCount - 1); info->fStyle = 0; - + info->fFlags = SkAdvancedTypefaceMetrics::kEmpty_FontFlag; SkTScopedComPtr<IDWriteLocalizedStrings> familyNames; SkTScopedComPtr<IDWriteLocalizedStrings> faceNames; @@ -1601,12 +1600,7 @@ SkAdvancedTypefaceMetrics* DWriteFontTypeface::onGetAdvancedTypefaceMetrics( } */ - // If Restricted, the font may not be embedded in a document. - // If not Restricted, the font can be embedded. - // If PreviewPrint, the embedding is read-only. - if (os2Table->version.v0.fsType.field.Restricted) { - info->fType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; - } else if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo) { + if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo) { if (fixedWidth) { appendRange(&info->fGlyphWidths, 0); int16_t advance; |