| 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;
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|