Index: src/pdf/SkPDFCanon.cpp |
diff --git a/src/pdf/SkPDFCanon.cpp b/src/pdf/SkPDFCanon.cpp |
index 6cc39954124b6bfb8e6015b79361f5143f8175e3..70286d8954d646c684cc0379dbbafff7cccf4dbf 100644 |
--- a/src/pdf/SkPDFCanon.cpp |
+++ b/src/pdf/SkPDFCanon.cpp |
@@ -5,6 +5,7 @@ |
* found in the LICENSE file. |
*/ |
+#include "SkImage.h" |
#include "SkPDFBitmap.h" |
#include "SkPDFCanon.h" |
#include "SkPDFFont.h" |
@@ -25,8 +26,12 @@ void SkPDFCanon::reset() { |
fImageShaderRecords.reset(); |
fGraphicStateRecords.foreach ([](WrapGS w) { w.fPtr->unref(); }); |
fGraphicStateRecords.reset(); |
- fBitmapRecords.unrefAll(); |
- fBitmapRecords.reset(); |
+ |
+ fBitmapToImageMap.foreachValue(SkSafeUnref<const SkImage>); |
+ fBitmapToImageMap.reset(); |
+ |
+ fPDFBitmapMap.foreachValue(SkSafeUnref<SkPDFObject>); |
+ fPDFBitmapMap.reset(); |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -121,10 +126,20 @@ void SkPDFCanon::addGraphicState(const SkPDFGraphicState* state) { |
//////////////////////////////////////////////////////////////////////////////// |
-SkPDFBitmap* SkPDFCanon::findBitmap(const SkBitmap& bm) const { |
- return find_item(fBitmapRecords, bm); |
+SkPDFObject* SkPDFCanon::findPDFBitmap(const SkImage* image) const { |
+ SkPDFObject** ptr = fPDFBitmapMap.find(image->uniqueID()); |
+ return ptr ? *ptr : nullptr; |
} |
-void SkPDFCanon::addBitmap(SkPDFBitmap* pdfBitmap) { |
- fBitmapRecords.push(SkRef(pdfBitmap)); |
+void SkPDFCanon::addPDFBitmap(uint32_t imageUniqueID, SkPDFObject* pdfBitmap) { |
+ fPDFBitmapMap.set(imageUniqueID, SkRef(pdfBitmap)); |
+} |
+ |
+const SkImage* SkPDFCanon::bitmapToImage(const SkBitmap& bm) { |
+ // reference remains owned by the fBitmapToImageMap! |
+ SkBitmapKey key(bm); |
+ if (const SkImage** img = fBitmapToImageMap.find(key)) { |
+ return *img; |
+ } |
+ return *fBitmapToImageMap.set(key, SkImage::NewFromBitmap(bm)); |
} |