Index: src/pdf/SkPDFCanon.cpp |
diff --git a/src/pdf/SkPDFCanon.cpp b/src/pdf/SkPDFCanon.cpp |
index 3dcf4e9f0f743b66d07aab48061b6dffc6abf28e..a804d6b47b9240506550683737b79fcee6ae5d5f 100644 |
--- a/src/pdf/SkPDFCanon.cpp |
+++ b/src/pdf/SkPDFCanon.cpp |
@@ -12,52 +12,25 @@ |
//////////////////////////////////////////////////////////////////////////////// |
-void SkPDFCanon::reset() { |
- for (int i = 0; i < fFontRecords.count(); ++i) { |
- fFontRecords[i].fFont->unref(); |
- } |
- fFontRecords.reset(); |
- |
- fFunctionShaderRecords.reset(); |
- fAlphaShaderRecords.reset(); |
- fImageShaderRecords.reset(); |
+namespace { |
+template <typename K, typename V> struct UnrefValue { |
+ void operator()(K, V** v) { SkSafeUnref(*v); } |
+}; |
+} |
+SkPDFCanon::~SkPDFCanon() { |
// TODO(halcanary): make SkTHashSet work nicely with sk_sp<>, |
// or use std::unordered_set<> |
fGraphicStateRecords.foreach ([](WrapGS w) { w.fPtr->unref(); }); |
- fGraphicStateRecords.reset(); |
- |
- fPDFBitmapMap.foreach([](SkBitmapKey, SkPDFObject** p) { (*p)->unref(); }); |
- fPDFBitmapMap.reset(); |
+ fPDFBitmapMap.foreach(UnrefValue<SkBitmapKey, SkPDFObject>()); |
+ fTypefaceMetrics.foreach(UnrefValue<uint32_t, SkAdvancedTypefaceMetrics>()); |
+ fFontDescriptors.foreach(UnrefValue<uint32_t, SkPDFDict>()); |
+ fFontMap.foreach(UnrefValue<uint64_t, SkPDFFont>()); |
} |
-//////////////////////////////////////////////////////////////////////////////// |
- |
-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; |
+void SkPDFCanon::reset() { |
+ this->~SkPDFCanon(); |
+ new (this)SkPDFCanon; |
} |
//////////////////////////////////////////////////////////////////////////////// |