Index: src/pdf/SkPDFCanon.cpp |
diff --git a/src/pdf/SkPDFCanon.cpp b/src/pdf/SkPDFCanon.cpp |
index 4e182aecfc417b32b6440fcec091d94e27d7b1ef..3dcf4e9f0f743b66d07aab48061b6dffc6abf28e 100644 |
--- a/src/pdf/SkPDFCanon.cpp |
+++ b/src/pdf/SkPDFCanon.cpp |
@@ -12,25 +12,52 @@ |
//////////////////////////////////////////////////////////////////////////////// |
-namespace { |
-template <typename K, typename V> struct UnrefValue { |
- void operator()(K, V** v) { (*v)->unref(); } |
-}; |
-} |
+void SkPDFCanon::reset() { |
+ for (int i = 0; i < fFontRecords.count(); ++i) { |
+ fFontRecords[i].fFont->unref(); |
+ } |
+ fFontRecords.reset(); |
-SkPDFCanon::~SkPDFCanon() { |
+ fFunctionShaderRecords.reset(); |
+ fAlphaShaderRecords.reset(); |
+ fImageShaderRecords.reset(); |
+ |
// TODO(halcanary): make SkTHashSet work nicely with sk_sp<>, |
// or use std::unordered_set<> |
fGraphicStateRecords.foreach ([](WrapGS w) { w.fPtr->unref(); }); |
- fPDFBitmapMap.foreach(UnrefValue<SkBitmapKey, SkPDFObject>()); |
- fTypefaceMetrics.foreach(UnrefValue<uint32_t, SkAdvancedTypefaceMetrics>()); |
- fFontDescriptors.foreach(UnrefValue<uint32_t, SkPDFDict>()); |
- fFontMap.foreach(UnrefValue<uint64_t, SkPDFFont>()); |
+ fGraphicStateRecords.reset(); |
+ |
+ fPDFBitmapMap.foreach([](SkBitmapKey, SkPDFObject** p) { (*p)->unref(); }); |
+ fPDFBitmapMap.reset(); |
} |
-void SkPDFCanon::reset() { |
- this->~SkPDFCanon(); |
- new (this)SkPDFCanon; |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+SkPDFFont* SkPDFCanon::findFont(uint32_t fontID, |
+ uint16_t glyphID, |
+ SkPDFFont** relatedFontPtr) const { |
+ SkASSERT(relatedFontPtr); |
+ |
+ SkPDFFont* relatedFont = nullptr; |
+ for (int i = 0; i < fFontRecords.count(); ++i) { |
+ SkPDFFont::Match match = SkPDFFont::IsMatch( |
+ fFontRecords[i].fFont, fFontRecords[i].fFontID, |
+ fFontRecords[i].fGlyphID, fontID, glyphID); |
+ if (SkPDFFont::kExact_Match == match) { |
+ return fFontRecords[i].fFont; |
+ } else if (!relatedFont && SkPDFFont::kRelated_Match == match) { |
+ relatedFont = fFontRecords[i].fFont; |
+ } |
+ } |
+ *relatedFontPtr = relatedFont; // May still be nullptr. |
+ return nullptr; |
+} |
+ |
+void SkPDFCanon::addFont(SkPDFFont* font, uint32_t fontID, uint16_t fGlyphID) { |
+ SkPDFCanon::FontRec* rec = fFontRecords.push(); |
+ rec->fFont = SkRef(font); |
+ rec->fFontID = fontID; |
+ rec->fGlyphID = fGlyphID; |
} |
//////////////////////////////////////////////////////////////////////////////// |