Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(530)

Unified Diff: src/pdf/SkPDFTypes.cpp

Issue 1049753002: SkPDF: Factor SkPDFCatalog into SkPDFObjNumMap and SkPDFSubstituteMap (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: full Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/pdf/SkPDFTypes.cpp
diff --git a/src/pdf/SkPDFTypes.cpp b/src/pdf/SkPDFTypes.cpp
index 02c5573360026a6274b4f80fe3fb9c55b37b95d0..e80d1186c38dc3e507604dd239e8570eec3653b0 100644
--- a/src/pdf/SkPDFTypes.cpp
+++ b/src/pdf/SkPDFTypes.cpp
@@ -7,7 +7,6 @@
*/
-#include "SkPDFCatalog.h"
#include "SkPDFTypes.h"
#include "SkStream.h"
@@ -25,17 +24,20 @@ SkPDFObjRef::SkPDFObjRef(SkPDFObject* obj) : fObj(obj) {
SkPDFObjRef::~SkPDFObjRef() {}
-void SkPDFObjRef::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
- SkPDFObject* obj = catalog->getSubstituteObject(fObj);
- stream->writeDecAsText(catalog->getObjectNumber(obj));
+void SkPDFObjRef::emitObject(SkWStream* stream,
+ const SkPDFObjNumMap& objNumMap,
+ const SkPDFSubstituteMap& substitutes) {
+ SkPDFObject* obj = substitutes.getSubstitute(fObj);
+ stream->writeDecAsText(objNumMap.getObjectNumber(obj));
stream->writeText(" 0 R"); // Generation number is always 0.
}
-void SkPDFObjRef::addResources(SkPDFCatalog* catalog) const {
- SkPDFObject* obj = catalog->getSubstituteObject(fObj);
+void SkPDFObjRef::addResources(SkPDFObjNumMap* catalog,
+ const SkPDFSubstituteMap& substitutes) const {
+ SkPDFObject* obj = substitutes.getSubstitute(fObj);
SkASSERT(obj);
if (catalog->addObject(obj)) {
- obj->addResources(catalog);
+ obj->addResources(catalog, substitutes);
}
}
@@ -44,7 +46,9 @@ void SkPDFObjRef::addResources(SkPDFCatalog* catalog) const {
SkPDFInt::SkPDFInt(int32_t value) : fValue(value) {}
SkPDFInt::~SkPDFInt() {}
-void SkPDFInt::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
+void SkPDFInt::emitObject(SkWStream* stream,
+ const SkPDFObjNumMap&,
+ const SkPDFSubstituteMap&) {
stream->writeDecAsText(fValue);
}
@@ -53,12 +57,10 @@ void SkPDFInt::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
SkPDFBool::SkPDFBool(bool value) : fValue(value) {}
SkPDFBool::~SkPDFBool() {}
-void SkPDFBool::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
- if (fValue) {
- stream->writeText("true");
- } else {
- stream->writeText("false");
- }
+void SkPDFBool::emitObject(SkWStream* stream,
+ const SkPDFObjNumMap&,
+ const SkPDFSubstituteMap&) {
+ stream->writeText(fValue ? "true" : "false");
}
////////////////////////////////////////////////////////////////////////////////
@@ -66,8 +68,10 @@ void SkPDFBool::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
SkPDFScalar::SkPDFScalar(SkScalar value) : fValue(value) {}
SkPDFScalar::~SkPDFScalar() {}
-void SkPDFScalar::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
- Append(fValue, stream);
+void SkPDFScalar::emitObject(SkWStream* stream,
+ const SkPDFObjNumMap&,
+ const SkPDFSubstituteMap&) {
+ SkPDFScalar::Append(fValue, stream);
}
// static
@@ -135,7 +139,9 @@ SkPDFString::SkPDFString(const uint16_t* value, size_t len, bool wideChars)
SkPDFString::~SkPDFString() {}
-void SkPDFString::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
+void SkPDFString::emitObject(SkWStream* stream,
+ const SkPDFObjNumMap&,
+ const SkPDFSubstituteMap&) {
stream->write(fValue.c_str(), fValue.size());
}
@@ -214,7 +220,9 @@ bool SkPDFName::operator==(const SkPDFName& b) const {
return fValue == b.fValue;
}
-void SkPDFName::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
+void SkPDFName::emitObject(SkWStream* stream,
+ const SkPDFObjNumMap&,
+ const SkPDFSubstituteMap&) {
stream->write(fValue.c_str(), fValue.size());
}
@@ -245,10 +253,13 @@ SkPDFArray::~SkPDFArray() {
fValue.unrefAll();
}
-void SkPDFArray::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
+void SkPDFArray::emitObject(SkWStream* stream,
+ const SkPDFObjNumMap& objNumMap,
+ const SkPDFSubstituteMap& substitutes) {
stream->writeText("[");
for (int i = 0; i < fValue.count(); i++) {
- catalog->getSubstituteObject(fValue[i])->emitObject(stream, catalog);
+ SkASSERT(substitutes.getSubstitute(fValue[i]) == fValue[i]);
+ fValue[i]->emitObject(stream, objNumMap, substitutes);
if (i + 1 < fValue.count()) {
stream->writeText(" ");
}
@@ -256,9 +267,11 @@ void SkPDFArray::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
stream->writeText("]");
}
-void SkPDFArray::addResources(SkPDFCatalog* catalog) const {
+void SkPDFArray::addResources(SkPDFObjNumMap* catalog,
+ const SkPDFSubstituteMap& substitutes) const {
for (int i = 0; i < fValue.count(); i++) {
- catalog->getSubstituteObject(fValue[i])->addResources(catalog);
+ SkASSERT(substitutes.getSubstitute(fValue[i]) == fValue[i]);
+ fValue[i]->addResources(catalog, substitutes);
}
}
@@ -313,26 +326,33 @@ int SkPDFDict::size() const {
return fValue.count();
}
-void SkPDFDict::emitObject(SkWStream* stream, SkPDFCatalog* catalog) {
+void SkPDFDict::emitObject(SkWStream* stream,
+ const SkPDFObjNumMap& objNumMap,
+ const SkPDFSubstituteMap& substitutes) {
stream->writeText("<<");
for (int i = 0; i < fValue.count(); i++) {
SkASSERT(fValue[i].key);
SkASSERT(fValue[i].value);
- fValue[i].key->emitObject(stream, catalog);
+ SkASSERT(substitutes.getSubstitute(fValue[i].key) == fValue[i].key);
+ SkASSERT(substitutes.getSubstitute(fValue[i].value) == fValue[i].value);
+ fValue[i].key->emitObject(stream, objNumMap, substitutes);
stream->writeText(" ");
- catalog->getSubstituteObject(fValue[i].value)
- ->emitObject(stream, catalog);
- stream->writeText("\n");
+ fValue[i].value->emitObject(stream, objNumMap, substitutes);
+ if (i + 1 < fValue.count()) {
+ stream->writeText("\n");
+ }
}
stream->writeText(">>");
}
-void SkPDFDict::addResources(SkPDFCatalog* catalog) const {
+void SkPDFDict::addResources(SkPDFObjNumMap* catalog,
+ const SkPDFSubstituteMap& substitutes) const {
for (int i = 0; i < fValue.count(); i++) {
SkASSERT(fValue[i].key);
SkASSERT(fValue[i].value);
- fValue[i].key->addResources(catalog);
- catalog->getSubstituteObject(fValue[i].value)->addResources(catalog);
+ fValue[i].key->addResources(catalog, substitutes);
+ SkASSERT(substitutes.getSubstitute(fValue[i].value) == fValue[i].value);
+ fValue[i].value->addResources(catalog, substitutes);
}
}
@@ -394,3 +414,40 @@ void SkPDFDict::mergeFrom(const SkPDFDict& other) {
Rec(SkRef(other.fValue[i].key), SkRef(other.fValue[i].value));
}
}
+
+////////////////////////////////////////////////////////////////////////////////
+
+SkPDFSubstituteMap::~SkPDFSubstituteMap() {
+ fSubstituteMap.foreach(
+ [](SkPDFObject*, SkPDFObject** v) { (*v)->unref(); });
+}
+
+void SkPDFSubstituteMap::setSubstitute(SkPDFObject* original,
+ SkPDFObject* substitute) {
+ SkASSERT(original != substitute);
+ SkASSERT(!fSubstituteMap.find(original));
+ fSubstituteMap.set(original, SkRef(substitute));
+}
+
+SkPDFObject* SkPDFSubstituteMap::getSubstitute(SkPDFObject* object) const {
+ SkPDFObject** found = fSubstituteMap.find(object);
+ return found ? *found : object;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+bool SkPDFObjNumMap::addObject(SkPDFObject* obj) {
+ if (fObjectNumbers.find(obj)) {
+ return false;
+ }
+ fObjectNumbers.set(obj, fObjectNumbers.count() + 1);
+ fObjects.push(obj);
+ return true;
+}
+
+int32_t SkPDFObjNumMap::getObjectNumber(SkPDFObject* obj) const {
+ int32_t* objectNumberFound = fObjectNumbers.find(obj);
+ SkASSERT(objectNumberFound);
+ return *objectNumberFound;
+}
+
« src/pdf/SkPDFStream.cpp ('K') | « src/pdf/SkPDFTypes.h ('k') | tests/PDFPrimitivesTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698