Index: src/pdf/SkPDFFont.cpp |
diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp |
index 769771ab236032e20cacbce780f2a842e0529a10..77473af52398e669b01a172b2265c1dcd39603bd 100644 |
--- a/src/pdf/SkPDFFont.cpp |
+++ b/src/pdf/SkPDFFont.cpp |
@@ -56,10 +56,10 @@ struct AdvanceMetric { |
class SkPDFType0Font final : public SkPDFFont { |
public: |
- SkPDFType0Font(const SkAdvancedTypefaceMetrics* info, |
- SkTypeface* typeface); |
+ SkPDFType0Font(sk_sp<const SkAdvancedTypefaceMetrics> info, |
+ sk_sp<SkTypeface> typeface, |
+ SkAdvancedTypefaceMetrics::FontType type); |
virtual ~SkPDFType0Font(); |
- bool multiByteGlyphs() const override { return true; } |
sk_sp<SkPDFObject> getFontSubset(const SkPDFGlyphSet* usage) override; |
#ifdef SK_DEBUG |
void emitObject(SkWStream*, |
@@ -77,11 +77,11 @@ private: |
class SkPDFCIDFont final : public SkPDFFont { |
public: |
- SkPDFCIDFont(const SkAdvancedTypefaceMetrics* info, |
- SkTypeface* typeface, |
+ SkPDFCIDFont(sk_sp<const SkAdvancedTypefaceMetrics> info, |
+ sk_sp<SkTypeface> typeface, |
+ SkAdvancedTypefaceMetrics::FontType fontType, |
const SkPDFGlyphSet* subset); |
virtual ~SkPDFCIDFont(); |
- bool multiByteGlyphs() const override { return true; } |
private: |
bool populate(const SkPDFGlyphSet* subset); |
@@ -91,12 +91,11 @@ private: |
class SkPDFType1Font final : public SkPDFFont { |
public: |
- SkPDFType1Font(const SkAdvancedTypefaceMetrics* info, |
- SkTypeface* typeface, |
+ SkPDFType1Font(sk_sp<const SkAdvancedTypefaceMetrics> info, |
+ sk_sp<SkTypeface> typeface, |
uint16_t glyphID, |
- SkPDFDict* relatedFontDescriptor); |
+ sk_sp<SkPDFDict> relatedFontDescriptor); |
virtual ~SkPDFType1Font(); |
- bool multiByteGlyphs() const override { return false; } |
private: |
bool populate(int16_t glyphID); |
@@ -105,8 +104,9 @@ private: |
class SkPDFType3Font final : public SkPDFFont { |
public: |
- SkPDFType3Font(const SkAdvancedTypefaceMetrics* info, |
- SkTypeface* typeface, |
+ SkPDFType3Font(sk_sp<const SkAdvancedTypefaceMetrics> info, |
+ sk_sp<SkTypeface> typeface, |
+ SkAdvancedTypefaceMetrics::FontType fontType, |
uint16_t glyphID); |
virtual ~SkPDFType3Font() {} |
void emitObject(SkWStream*, |
@@ -115,7 +115,6 @@ public: |
SkDEBUGFAIL("should call getFontSubset!"); |
} |
sk_sp<SkPDFObject> getFontSubset(const SkPDFGlyphSet* usage) override; |
- bool multiByteGlyphs() const override { return false; } |
}; |
/////////////////////////////////////////////////////////////////////////////// |
@@ -468,14 +467,6 @@ SkPDFGlyphSet* SkPDFGlyphSetMap::getGlyphSetForFont(SkPDFFont* font) { |
SkPDFFont::~SkPDFFont() {} |
-SkTypeface* SkPDFFont::typeface() { |
- return fTypeface.get(); |
-} |
- |
-SkAdvancedTypefaceMetrics::FontType SkPDFFont::getType() { |
- return fFontType; |
-} |
- |
bool SkPDFFont::canEmbed() const { |
if (!fFontInfo.get()) { |
SkASSERT(fFontType == SkAdvancedTypefaceMetrics::kOther_Font); |
@@ -519,16 +510,15 @@ int SkPDFFont::glyphsToPDFFontEncoding(uint16_t* glyphIDs, int numGlyphs) { |
// static |
SkPDFFont* SkPDFFont::GetFontResource(SkPDFCanon* canon, |
- SkTypeface* typeface, |
+ SkTypeface* face, |
uint16_t glyphID) { |
SkASSERT(canon); |
- const uint32_t fontID = SkTypeface::UniqueID(typeface); |
+ const uint32_t fontID = SkTypeface::UniqueID(face); |
SkPDFFont* relatedFont; |
if (SkPDFFont* pdfFont = canon->findFont(fontID, glyphID, &relatedFont)) { |
return SkRef(pdfFont); |
} |
- SkAutoResolveDefaultTypeface autoResolve(typeface); |
- typeface = autoResolve.get(); |
+ sk_sp<SkTypeface> typeface(face ? sk_ref_sp(face) : SkTypeface::MakeDefault()); |
SkASSERT(typeface); |
int glyphCount = typeface->countGlyphs(); |
if (glyphCount < 1 || // typeface lacks even a NOTDEF glyph. |
@@ -537,122 +527,106 @@ SkPDFFont* SkPDFFont::GetFontResource(SkPDFCanon* canon, |
return nullptr; |
} |
sk_sp<const SkAdvancedTypefaceMetrics> fontMetrics; |
- SkPDFDict* relatedFontDescriptor = nullptr; |
+ sk_sp<SkPDFDict> relatedFontDescriptor; |
if (relatedFont) { |
- fontMetrics.reset(SkSafeRef(relatedFont->fontInfo())); |
- relatedFontDescriptor = relatedFont->getFontDescriptor(); |
+ fontMetrics = relatedFont->refFontInfo(); |
+ relatedFontDescriptor = relatedFont->refFontDescriptor(); |
// This only is to catch callers who pass invalid glyph ids. |
// If glyph id is invalid, then we will create duplicate entries |
// for TrueType fonts. |
- SkAdvancedTypefaceMetrics::FontType fontType = |
- fontMetrics.get() ? fontMetrics.get()->fType : |
- SkAdvancedTypefaceMetrics::kOther_Font; |
- |
- if (fontType == SkAdvancedTypefaceMetrics::kType1CID_Font || |
- fontType == SkAdvancedTypefaceMetrics::kTrueType_Font) { |
- return SkRef(relatedFont); |
- } |
+ SkDEBUGCODE(SkAdvancedTypefaceMetrics::FontType fontType = relatedFont->getType()); |
+ SkASSERT(fontType != SkAdvancedTypefaceMetrics::kType1CID_Font); |
+ SkASSERT(fontType != SkAdvancedTypefaceMetrics::kTrueType_Font); |
} else { |
- SkTypeface::PerGlyphInfo info = |
- SkTBitOr(SkTypeface::kGlyphNames_PerGlyphInfo, |
- SkTypeface::kToUnicode_PerGlyphInfo); |
+ SkTypeface::PerGlyphInfo info = SkTypeface::kGlyphNames_PerGlyphInfo | |
+ SkTypeface::kToUnicode_PerGlyphInfo; |
fontMetrics.reset( |
typeface->getAdvancedTypefaceMetrics(info, nullptr, 0)); |
} |
- SkPDFFont* font = SkPDFFont::Create(canon, fontMetrics.get(), typeface, |
- glyphID, relatedFontDescriptor); |
- canon->addFont(font, fontID, font->fFirstGlyphID); |
- return font; |
-} |
- |
-sk_sp<SkPDFObject> SkPDFFont::getFontSubset(const SkPDFGlyphSet*) { |
- return nullptr; // Default: no support. |
-} |
- |
-// TODO: take a sk_sp<SkAdvancedTypefaceMetrics> and sk_sp<SkTypeface> |
-SkPDFFont::SkPDFFont(const SkAdvancedTypefaceMetrics* info, |
- SkTypeface* typeface, |
- SkPDFDict* relatedFontDescriptor) |
- : SkPDFDict("Font") |
- , fTypeface(ref_or_default(typeface)) |
- , fFirstGlyphID(1) |
- , fLastGlyphID(info ? info->fLastGlyphID : 0) |
- , fFontInfo(SkSafeRef(info)) |
- , fDescriptor(SkSafeRef(relatedFontDescriptor)) |
- , fFontType((!info || info->fFlags & SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag) |
- ? SkAdvancedTypefaceMetrics::kOther_Font |
- : info->fType) { |
- SkASSERT(fTypeface); |
- if (0 == fLastGlyphID) { |
- fLastGlyphID = SkToU16(fTypeface->countGlyphs() - 1); |
- } |
-} |
- |
-// static |
-SkPDFFont* SkPDFFont::Create(SkPDFCanon* canon, |
- const SkAdvancedTypefaceMetrics* info, |
- SkTypeface* typeface, |
- uint16_t glyphID, |
- SkPDFDict* relatedFontDescriptor) { |
SkAdvancedTypefaceMetrics::FontType type = |
- info ? info->fType : SkAdvancedTypefaceMetrics::kOther_Font; |
- SkAdvancedTypefaceMetrics::FontFlags flags = |
- info ? info->fFlags : SkAdvancedTypefaceMetrics::kEmpty_FontFlag; |
- if (SkToBool(flags & SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag)) { |
- return new SkPDFType3Font(info, typeface, glyphID); |
+ fontMetrics ? fontMetrics->fType : SkAdvancedTypefaceMetrics::kOther_Font; |
+ if (fontMetrics && |
+ SkToBool(fontMetrics->fFlags & |
+ SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag)) { |
+ // force Type3 fallback. |
+ type = SkAdvancedTypefaceMetrics::kOther_Font; |
} |
+ |
+ sk_sp<SkPDFFont> font; |
switch (type) { |
case SkAdvancedTypefaceMetrics::kType1CID_Font: |
case SkAdvancedTypefaceMetrics::kTrueType_Font: |
SkASSERT(relatedFontDescriptor == nullptr); |
- SkASSERT(info != nullptr); |
- return new SkPDFType0Font(info, typeface); |
+ SkASSERT(fontMetrics != nullptr); |
+ font = sk_make_sp<SkPDFType0Font>(std::move(fontMetrics), |
+ std::move(typeface), |
+ type); |
+ break; |
case SkAdvancedTypefaceMetrics::kType1_Font: |
- SkASSERT(info != nullptr); |
- return new SkPDFType1Font(info, typeface, glyphID, relatedFontDescriptor); |
+ SkASSERT(fontMetrics != nullptr); |
+ font = sk_make_sp<SkPDFType1Font>(std::move(fontMetrics), |
+ std::move(typeface), |
+ glyphID, |
+ std::move(relatedFontDescriptor)); |
+ break; |
case SkAdvancedTypefaceMetrics::kCFF_Font: |
- SkASSERT(info != nullptr); |
+ SkASSERT(fontMetrics != nullptr); |
// fallthrough |
case SkAdvancedTypefaceMetrics::kOther_Font: |
- return new SkPDFType3Font(info, typeface, glyphID); |
+ font = sk_make_sp<SkPDFType3Font>(std::move(fontMetrics), |
+ std::move(typeface), |
+ type, |
+ glyphID); |
+ break; |
+ default: |
+ SkDEBUGFAIL("invalid SkAdvancedTypefaceMetrics::FontType"); |
+ return nullptr; |
} |
- SkDEBUGFAIL("invalid SkAdvancedTypefaceMetrics::FontType"); |
- return nullptr; |
+ // When firstGlyphID==0, SkFont::IsMatch() matches all glyphs in font. |
+ SkGlyphID firstGlyphID = font->multiByteGlyphs() ? 0 : font->fFirstGlyphID; |
+ // TODO(halcanary) Make SkCanon::addFont take sk_sp<SkPDFFont>. |
+ canon->addFont(font.get(), fontID, firstGlyphID); |
+ return font.release(); // TODO(halcanary) return sk_sp<SkPDFFont>. |
} |
-const SkAdvancedTypefaceMetrics* SkPDFFont::fontInfo() { |
- return fFontInfo.get(); |
+sk_sp<SkPDFObject> SkPDFFont::getFontSubset(const SkPDFGlyphSet*) { |
+ return nullptr; // Default: no support. |
} |
-void SkPDFFont::setFontInfo(const SkAdvancedTypefaceMetrics* info) { |
- if (info == nullptr || info == fFontInfo.get()) { |
- return; |
+// TODO: take a sk_sp<SkAdvancedTypefaceMetrics> and sk_sp<SkTypeface> |
+SkPDFFont::SkPDFFont(sk_sp<const SkAdvancedTypefaceMetrics> info, |
+ sk_sp<SkTypeface> typeface, |
+ sk_sp<SkPDFDict> relatedFontDescriptor, |
+ SkAdvancedTypefaceMetrics::FontType fontType, |
+ bool multiByteGlyphs) |
+ : SkPDFDict("Font") |
+ , fTypeface(std::move(typeface)) |
+ , fFontInfo(std::move(info)) |
+ , fDescriptor(std::move(relatedFontDescriptor)) |
+ , fFirstGlyphID(1) |
+ , fFontType(fontType) |
+ , fMultiByteGlyphs(multiByteGlyphs) { |
+ SkASSERT(fTypeface); |
+ fLastGlyphID = fFontInfo ? fFontInfo->fLastGlyphID : 0; |
+ if (0 == fLastGlyphID) { |
+ fLastGlyphID = SkToU16(fTypeface->countGlyphs() - 1); |
} |
- fFontInfo.reset(info); |
- SkSafeRef(info); |
-} |
- |
-uint16_t SkPDFFont::firstGlyphID() const { |
- return fFirstGlyphID; |
} |
-uint16_t SkPDFFont::lastGlyphID() const { |
- return fLastGlyphID; |
+void SkPDFFont::setFontInfo(sk_sp<const SkAdvancedTypefaceMetrics> info) { |
+ if (info) { |
+ fFontInfo = std::move(info); |
+ } |
} |
void SkPDFFont::setLastGlyphID(uint16_t glyphID) { |
fLastGlyphID = glyphID; |
} |
-SkPDFDict* SkPDFFont::getFontDescriptor() { |
- return fDescriptor.get(); |
-} |
- |
-void SkPDFFont::setFontDescriptor(SkPDFDict* descriptor) { |
- fDescriptor.reset(descriptor); |
- SkSafeRef(descriptor); |
+void SkPDFFont::setFontDescriptor(sk_sp<SkPDFDict> descriptor) { |
+ fDescriptor = std::move(descriptor); |
} |
bool SkPDFFont::addCommonFontDescriptorEntries(int16_t defaultWidth) { |
@@ -663,7 +637,7 @@ bool SkPDFFont::addCommonFontDescriptorEntries(int16_t defaultWidth) { |
const uint16_t emSize = fFontInfo->fEmSize; |
fDescriptor->insertName("FontName", fFontInfo->fFontName); |
- fDescriptor->insertInt("Flags", fFontInfo->fStyle | kPdfSymbolic); |
+ fDescriptor->insertInt("Flags", (size_t)(fFontInfo->fStyle | kPdfSymbolic)); |
fDescriptor->insertScalar("Ascent", |
scaleFromFontUnits(fFontInfo->fAscent, emSize)); |
fDescriptor->insertScalar("Descent", |
@@ -708,8 +682,10 @@ void SkPDFFont::populateToUnicodeTable(const SkPDFGlyphSet* subset) { |
// class SkPDFType0Font |
/////////////////////////////////////////////////////////////////////////////// |
-SkPDFType0Font::SkPDFType0Font(const SkAdvancedTypefaceMetrics* info, SkTypeface* typeface) |
- : SkPDFFont(info, typeface, nullptr) { |
+SkPDFType0Font::SkPDFType0Font(sk_sp<const SkAdvancedTypefaceMetrics> info, |
+ sk_sp<SkTypeface> typeface, |
+ SkAdvancedTypefaceMetrics::FontType fontType) |
+ : SkPDFFont(std::move(info), std::move(typeface), nullptr, fontType, true) { |
SkDEBUGCODE(fPopulated = false); |
if (!canSubset()) { |
this->populate(nullptr); |
@@ -722,7 +698,7 @@ sk_sp<SkPDFObject> SkPDFType0Font::getFontSubset(const SkPDFGlyphSet* subset) { |
if (!canSubset()) { |
return nullptr; |
} |
- auto newSubset = sk_make_sp<SkPDFType0Font>(fontInfo(), typeface()); |
+ auto newSubset = sk_make_sp<SkPDFType0Font>(refFontInfo(), refTypeface(), getType()); |
newSubset->populate(subset); |
return newSubset; |
} |
@@ -738,11 +714,14 @@ void SkPDFType0Font::emitObject(SkWStream* stream, |
bool SkPDFType0Font::populate(const SkPDFGlyphSet* subset) { |
insertName("Subtype", "Type0"); |
- insertName("BaseFont", fontInfo()->fFontName); |
+ insertName("BaseFont", this->getFontInfo()->fFontName); |
insertName("Encoding", "Identity-H"); |
sk_sp<SkPDFCIDFont> newCIDFont( |
- new SkPDFCIDFont(fontInfo(), typeface(), subset)); |
+ sk_make_sp<SkPDFCIDFont>(this->refFontInfo(), |
+ this->refTypeface(), |
+ this->getType(), |
+ subset)); |
auto descendantFonts = sk_make_sp<SkPDFArray>(); |
descendantFonts->appendObjRef(std::move(newCIDFont)); |
this->insertObject("DescendantFonts", std::move(descendantFonts)); |
@@ -757,10 +736,12 @@ bool SkPDFType0Font::populate(const SkPDFGlyphSet* subset) { |
// class SkPDFCIDFont |
/////////////////////////////////////////////////////////////////////////////// |
-SkPDFCIDFont::SkPDFCIDFont(const SkAdvancedTypefaceMetrics* info, |
- SkTypeface* typeface, |
+SkPDFCIDFont::SkPDFCIDFont(sk_sp<const SkAdvancedTypefaceMetrics> info, |
+ sk_sp<SkTypeface> typeface, |
+ SkAdvancedTypefaceMetrics::FontType fontType, |
const SkPDFGlyphSet* subset) |
- : SkPDFFont(info, typeface, nullptr) { |
+ : SkPDFFont(std::move(info), std::move(typeface), nullptr, |
+ fontType , /* multiByteGlyphs = */ true) { |
this->populate(subset); |
} |
@@ -822,7 +803,7 @@ static sk_sp<SkPDFObject> get_subset_font_stream( |
bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth, |
const SkTDArray<uint32_t>* subset) { |
auto descriptor = sk_make_sp<SkPDFDict>("FontDescriptor"); |
- setFontDescriptor(descriptor.get()); |
+ setFontDescriptor(descriptor); |
if (!addCommonFontDescriptorEntries(defaultWidth)) { |
this->insertObjRef("FontDescriptor", std::move(descriptor)); |
return false; |
@@ -846,8 +827,9 @@ bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth, |
#ifdef SK_SFNTLY_SUBSETTER |
if (this->canSubset() && subset) { |
+ const char* name = this->getFontInfo()->fFontName.c_str(); |
sk_sp<SkPDFObject> subsetStream = get_subset_font_stream( |
- std::move(fontAsset), *subset, fontInfo()->fFontName.c_str()); |
+ std::move(fontAsset), *subset, name); |
if (subsetStream) { |
descriptor->insertObjRef("FontFile2", std::move(subsetStream)); |
break; |
@@ -927,19 +909,19 @@ bool SkPDFCIDFont::populate(const SkPDFGlyphSet* subset) { |
} |
subset->exportTo(&glyphIDs); |
} |
- if (fontInfo()->fType == SkAdvancedTypefaceMetrics::kTrueType_Font) { |
+ if (this->getType() == SkAdvancedTypefaceMetrics::kTrueType_Font) { |
uint32_t* glyphs = (glyphIDs.count() == 0) ? nullptr : glyphIDs.begin(); |
uint32_t glyphsCount = glyphs ? glyphIDs.count() : 0; |
sk_sp<const SkAdvancedTypefaceMetrics> fontMetrics = |
SkPDFFont::GetFontMetricsWithGlyphNames(this->typeface(), glyphs, glyphsCount); |
- this->setFontInfo(fontMetrics.get()); |
+ this->setFontInfo(std::move(fontMetrics)); |
this->addFontDescriptor(0, &glyphIDs); |
} else { |
// Other CID fonts |
addFontDescriptor(0, nullptr); |
} |
- insertName("BaseFont", fontInfo()->fFontName); |
+ insertName("BaseFont", this->getFontInfo()->fFontName); |
if (getType() == SkAdvancedTypefaceMetrics::kType1CID_Font) { |
insertName("Subtype", "CIDFontType0"); |
@@ -959,7 +941,7 @@ bool SkPDFCIDFont::populate(const SkPDFGlyphSet* subset) { |
SkSinglyLinkedList<AdvanceMetric> tmpMetrics; |
set_glyph_widths(this->typeface(), &glyphIDs, &tmpMetrics); |
int16_t defaultWidth = 0; |
- uint16_t emSize = (uint16_t)this->fontInfo()->fEmSize; |
+ uint16_t emSize = (uint16_t)this->getFontInfo()->fEmSize; |
sk_sp<SkPDFArray> widths = composeAdvanceData(tmpMetrics, emSize, &defaultWidth); |
if (widths->size()) { |
this->insertObject("W", std::move(widths)); |
@@ -974,25 +956,28 @@ bool SkPDFCIDFont::populate(const SkPDFGlyphSet* subset) { |
// class SkPDFType1Font |
/////////////////////////////////////////////////////////////////////////////// |
-SkPDFType1Font::SkPDFType1Font(const SkAdvancedTypefaceMetrics* info, |
- SkTypeface* typeface, |
+SkPDFType1Font::SkPDFType1Font(sk_sp<const SkAdvancedTypefaceMetrics> info, |
+ sk_sp<SkTypeface> typeface, |
uint16_t glyphID, |
- SkPDFDict* relatedFontDescriptor) |
- : SkPDFFont(info, typeface, relatedFontDescriptor) { |
- this->populate(glyphID); |
+ sk_sp<SkPDFDict> relatedFontDescriptor) |
+ : SkPDFFont(std::move(info), |
+ std::move(typeface), |
+ std::move(relatedFontDescriptor), |
+ SkAdvancedTypefaceMetrics::kType1_Font, |
+ /* multiByteGlyphs = */ false) { |
+ this->populate(glyphID); // TODO(halcanary): subset this. |
} |
SkPDFType1Font::~SkPDFType1Font() {} |
bool SkPDFType1Font::addFontDescriptor(int16_t defaultWidth) { |
- if (SkPDFDict* descriptor = getFontDescriptor()) { |
- this->insertObjRef("FontDescriptor", |
- sk_ref_sp(descriptor)); |
+ if (sk_sp<SkPDFDict> descriptor = this->refFontDescriptor()) { |
+ this->insertObjRef("FontDescriptor", std::move(descriptor)); |
return true; |
} |
auto descriptor = sk_make_sp<SkPDFDict>("FontDescriptor"); |
- setFontDescriptor(descriptor.get()); |
+ setFontDescriptor(descriptor); |
int ttcIndex; |
size_t header SK_INIT_TO_AVOID_WARNING; |
@@ -1018,7 +1003,7 @@ bool SkPDFType1Font::addFontDescriptor(int16_t defaultWidth) { |
bool SkPDFType1Font::populate(int16_t glyphID) { |
this->insertName("Subtype", "Type1"); |
- this->insertName("BaseFont", fontInfo()->fFontName); |
+ this->insertName("BaseFont", this->getFontInfo()->fFontName); |
adjustGlyphRangeForSingleByteEncoding(glyphID); |
SkGlyphID firstGlyphID = this->firstGlyphID(); |
SkGlyphID lastGlyphID = this->lastGlyphID(); |
@@ -1037,7 +1022,7 @@ bool SkPDFType1Font::populate(int16_t glyphID) { |
SkAutoGlyphCache glyphCache(tmpPaint, &props, nullptr); |
auto widths = sk_make_sp<SkPDFArray>(); |
SkScalar advance = glyphCache->getGlyphIDAdvance(0).fAdvanceX; |
- const uint16_t emSize = this->fontInfo()->fEmSize; |
+ const uint16_t emSize = this->getFontInfo()->fEmSize; |
widths->appendScalar(from_font_units(advance, emSize)); |
for (unsigned gID = firstGlyphID; gID <= lastGlyphID; gID++) { |
advance = glyphCache->getGlyphIDAdvance(gID).fAdvanceX; |
@@ -1051,7 +1036,7 @@ bool SkPDFType1Font::populate(int16_t glyphID) { |
auto encDiffs = sk_make_sp<SkPDFArray>(); |
encDiffs->reserve(lastGlyphID - firstGlyphID + 3); |
encDiffs->appendInt(0); |
- const SkTArray<SkString>& glyphNames = this->fontInfo()->fGlyphNames; |
+ const SkTArray<SkString>& glyphNames = this->getFontInfo()->fGlyphNames; |
SkASSERT(glyphNames.count() > lastGlyphID); |
encDiffs->appendName(glyphNames[0].c_str()); |
const SkString unknown("UNKNOWN"); |
@@ -1221,12 +1206,14 @@ static void add_type3_font_info(SkPDFDict* font, |
font->insertObject("CharProcs", std::move(charProcs)); |
} |
-SkPDFType3Font::SkPDFType3Font(const SkAdvancedTypefaceMetrics* info, |
- SkTypeface* typeface, |
+SkPDFType3Font::SkPDFType3Font(sk_sp<const SkAdvancedTypefaceMetrics> info, |
+ sk_sp<SkTypeface> typeface, |
+ SkAdvancedTypefaceMetrics::FontType fontType, |
uint16_t glyphID) |
- : SkPDFFont(info, typeface, nullptr) { |
+ : SkPDFFont(std::move(info), std::move(typeface), nullptr, |
+ fontType, /* multiByteGlyphs = */ false) { |
// If fLastGlyphID isn't set (because there is not fFontInfo), look it up. |
- this->setLastGlyphID(SkToU16(typeface->countGlyphs() - 1)); |
+ this->setLastGlyphID(SkToU16(this->typeface()->countGlyphs() - 1)); |
this->adjustGlyphRangeForSingleByteEncoding(glyphID); |
} |
@@ -1234,7 +1221,7 @@ sk_sp<SkPDFObject> SkPDFType3Font::getFontSubset(const SkPDFGlyphSet* usage) { |
// All fonts are subset before serialization. |
// TODO(halcanary): all fonts should follow this pattern. |
auto font = sk_make_sp<SkPDFDict>("Font"); |
- const SkAdvancedTypefaceMetrics* info = this->fontInfo(); |
+ const SkAdvancedTypefaceMetrics* info = this->getFontInfo(); |
uint16_t emSize = info && info->fEmSize > 0 ? info->fEmSize : 1000; |
add_type3_font_info(font.get(), this->typeface(), (SkScalar)emSize, usage, |
this->firstGlyphID(), this->lastGlyphID()); |