Chromium Code Reviews| Index: src/pdf/SkPDFCanon.cpp |
| diff --git a/src/pdf/SkPDFCanon.cpp b/src/pdf/SkPDFCanon.cpp |
| index 3dcf4e9f0f743b66d07aab48061b6dffc6abf28e..dc40b076076b10e4d20b41bad911f2d1a90751e7 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 KVUnrefer { |
|
bungeman-skia
2016/08/17 19:03:07
This name makes me think it's going to unref both
hal.canary
2016/08/17 19:29:49
Done.
|
| + void operator()(K, V** v) { (*v)->unref(); } |
| +}; |
| +} |
| +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(KVUnrefer<SkBitmapKey, SkPDFObject>()); |
| + fTypefaceMetrics.foreach(KVUnrefer<uint32_t, SkAdvancedTypefaceMetrics>()); |
| + fFontDescriptors.foreach(KVUnrefer<uint32_t, SkPDFDict>()); |
| + fFontMap.foreach(KVUnrefer<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; |
| } |
| //////////////////////////////////////////////////////////////////////////////// |