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

Unified Diff: src/pdf/SkPDFTypes.cpp

Issue 1790023003: SkPDF: add drop() virtual to release resources early. (Closed) Base URL: https://skia.googlesource.com/skia.git@skpdf-global
Patch Set: free → release Created 4 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
« no previous file with comments | « src/pdf/SkPDFTypes.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/pdf/SkPDFTypes.cpp
diff --git a/src/pdf/SkPDFTypes.cpp b/src/pdf/SkPDFTypes.cpp
index e6fe74447df989bedb1b9c6411ca786f83d263aa..b8727a9145d5ab1c813490b55088068a88184308 100644
--- a/src/pdf/SkPDFTypes.cpp
+++ b/src/pdf/SkPDFTypes.cpp
@@ -263,21 +263,26 @@ void SkPDFAtom::addResources(SkPDFObjNumMap* map,
////////////////////////////////////////////////////////////////////////////////
-SkPDFArray::SkPDFArray() {}
-SkPDFArray::~SkPDFArray() {
- for (SkPDFUnion& value : fValues) {
- value.~SkPDFUnion();
- }
+SkPDFArray::SkPDFArray() { SkDEBUGCODE(fDumped = false;) }
+
+SkPDFArray::~SkPDFArray() { this->drop(); }
+
+void SkPDFArray::drop() {
fValues.reset();
+ SkDEBUGCODE(fDumped = true;)
}
int SkPDFArray::size() const { return fValues.count(); }
-void SkPDFArray::reserve(int length) { fValues.setReserve(length); }
+void SkPDFArray::reserve(int length) {
+ // TODO(halcanary): implement SkTArray<T>::reserve() or change the
+ // contstructor of SkPDFArray to take reserve size.
+}
void SkPDFArray::emitObject(SkWStream* stream,
const SkPDFObjNumMap& objNumMap,
const SkPDFSubstituteMap& substitutes) const {
+ SkASSERT(!fDumped);
stream->writeText("[");
for (int i = 0; i < fValues.count(); i++) {
fValues[i].emitObject(stream, objNumMap, substitutes);
@@ -290,13 +295,14 @@ void SkPDFArray::emitObject(SkWStream* stream,
void SkPDFArray::addResources(SkPDFObjNumMap* catalog,
const SkPDFSubstituteMap& substitutes) const {
+ SkASSERT(!fDumped);
for (const SkPDFUnion& value : fValues) {
value.addResources(catalog, substitutes);
}
}
void SkPDFArray::append(SkPDFUnion&& value) {
- new (fValues.append()) SkPDFUnion(std::move(value));
+ fValues.emplace_back(std::move(value));
}
void SkPDFArray::appendInt(int32_t value) {
@@ -337,11 +343,19 @@ void SkPDFArray::appendObjRef(sk_sp<SkPDFObject> objSp) {
///////////////////////////////////////////////////////////////////////////////
-SkPDFDict::SkPDFDict() {}
+SkPDFDict::~SkPDFDict() { this->drop(); }
-SkPDFDict::~SkPDFDict() { this->clear(); }
+void SkPDFDict::drop() {
+ fRecords.reset();
+ SkDEBUGCODE(fDumped = true;)
+}
-SkPDFDict::SkPDFDict(const char type[]) { this->insertName("Type", type); }
+SkPDFDict::SkPDFDict(const char type[]) {
+ SkDEBUGCODE(fDumped = false;)
+ if (type) {
+ this->insertName("Type", type);
+ }
+}
void SkPDFDict::emitObject(SkWStream* stream,
const SkPDFObjNumMap& objNumMap,
@@ -354,6 +368,7 @@ void SkPDFDict::emitObject(SkWStream* stream,
void SkPDFDict::emitAll(SkWStream* stream,
const SkPDFObjNumMap& objNumMap,
const SkPDFSubstituteMap& substitutes) const {
+ SkASSERT(!fDumped);
for (int i = 0; i < fRecords.count(); i++) {
fRecords[i].fKey.emitObject(stream, objNumMap, substitutes);
stream->writeText(" ");
@@ -366,41 +381,48 @@ void SkPDFDict::emitAll(SkWStream* stream,
void SkPDFDict::addResources(SkPDFObjNumMap* catalog,
const SkPDFSubstituteMap& substitutes) const {
+ SkASSERT(!fDumped);
for (int i = 0; i < fRecords.count(); i++) {
fRecords[i].fKey.addResources(catalog, substitutes);
fRecords[i].fValue.addResources(catalog, substitutes);
}
}
-void SkPDFDict::set(SkPDFUnion&& name, SkPDFUnion&& value) {
- Record* rec = fRecords.append();
- SkASSERT(name.isName());
- new (&rec->fKey) SkPDFUnion(std::move(name));
- new (&rec->fValue) SkPDFUnion(std::move(value));
+SkPDFDict::Record::Record(SkPDFUnion&& k, SkPDFUnion&& v)
+ : fKey(std::move(k)), fValue(std::move(v)) {}
+
+SkPDFDict::Record::Record(SkPDFDict::Record&& o)
+ : fKey(std::move(o.fKey)), fValue(std::move(o.fValue)) {}
+
+SkPDFDict::Record& SkPDFDict::Record::operator=(SkPDFDict::Record&& o) {
+ fKey = std::move(o.fKey);
+ fValue = std::move(o.fValue);
+ return *this;
}
int SkPDFDict::size() const { return fRecords.count(); }
void SkPDFDict::insertObjRef(const char key[], sk_sp<SkPDFObject> objSp) {
- this->set(SkPDFUnion::Name(key), SkPDFUnion::ObjRef(std::move(objSp)));
+ fRecords.emplace_back(SkPDFUnion::Name(key), SkPDFUnion::ObjRef(std::move(objSp)));
}
+
void SkPDFDict::insertObjRef(const SkString& key, sk_sp<SkPDFObject> objSp) {
- this->set(SkPDFUnion::Name(key), SkPDFUnion::ObjRef(std::move(objSp)));
+ fRecords.emplace_back(SkPDFUnion::Name(key), SkPDFUnion::ObjRef(std::move(objSp)));
}
void SkPDFDict::insertObject(const char key[], sk_sp<SkPDFObject> objSp) {
- this->set(SkPDFUnion::Name(key), SkPDFUnion::Object(std::move(objSp)));
+ fRecords.emplace_back(SkPDFUnion::Name(key), SkPDFUnion::Object(std::move(objSp)));
}
void SkPDFDict::insertObject(const SkString& key, sk_sp<SkPDFObject> objSp) {
- this->set(SkPDFUnion::Name(key), SkPDFUnion::Object(std::move(objSp)));
+ fRecords.emplace_back(SkPDFUnion::Name(key), SkPDFUnion::Object(std::move(objSp)));
}
void SkPDFDict::insertBool(const char key[], bool value) {
- this->set(SkPDFUnion::Name(key), SkPDFUnion::Bool(value));
+ fRecords.emplace_back(SkPDFUnion::Name(key), SkPDFUnion::Bool(value));
}
void SkPDFDict::insertInt(const char key[], int32_t value) {
- this->set(SkPDFUnion::Name(key), SkPDFUnion::Int(value));
+ fRecords.emplace_back(SkPDFUnion::Name(key), SkPDFUnion::Int(value));
}
void SkPDFDict::insertInt(const char key[], size_t value) {
@@ -408,39 +430,46 @@ void SkPDFDict::insertInt(const char key[], size_t value) {
}
void SkPDFDict::insertScalar(const char key[], SkScalar value) {
- this->set(SkPDFUnion::Name(key), SkPDFUnion::Scalar(value));
+ fRecords.emplace_back(SkPDFUnion::Name(key), SkPDFUnion::Scalar(value));
}
void SkPDFDict::insertName(const char key[], const char name[]) {
- this->set(SkPDFUnion::Name(key), SkPDFUnion::Name(name));
+ fRecords.emplace_back(SkPDFUnion::Name(key), SkPDFUnion::Name(name));
}
void SkPDFDict::insertName(const char key[], const SkString& name) {
- this->set(SkPDFUnion::Name(key), SkPDFUnion::Name(name));
+ fRecords.emplace_back(SkPDFUnion::Name(key), SkPDFUnion::Name(name));
}
void SkPDFDict::insertString(const char key[], const char value[]) {
- this->set(SkPDFUnion::Name(key), SkPDFUnion::String(value));
+ fRecords.emplace_back(SkPDFUnion::Name(key), SkPDFUnion::String(value));
}
void SkPDFDict::insertString(const char key[], const SkString& value) {
- this->set(SkPDFUnion::Name(key), SkPDFUnion::String(value));
+ fRecords.emplace_back(SkPDFUnion::Name(key), SkPDFUnion::String(value));
}
-void SkPDFDict::clear() {
- for (Record& rec : fRecords) {
- rec.fKey.~SkPDFUnion();
- rec.fValue.~SkPDFUnion();
- }
- fRecords.reset();
+////////////////////////////////////////////////////////////////////////////////
+
+SkPDFSharedStream::SkPDFSharedStream(SkStreamAsset* data)
+ : fAsset(data), fDict(new SkPDFDict) {
+ SkDEBUGCODE(fDumped = false;)
+ SkASSERT(data);
}
-////////////////////////////////////////////////////////////////////////////////
+SkPDFSharedStream::~SkPDFSharedStream() { this->drop(); }
+
+void SkPDFSharedStream::drop() {
+ fAsset.reset();
+ fDict.reset(nullptr);
+ SkDEBUGCODE(fDumped = true;)
+}
void SkPDFSharedStream::emitObject(
SkWStream* stream,
const SkPDFObjNumMap& objNumMap,
const SkPDFSubstituteMap& substitutes) const {
+ SkASSERT(!fDumped);
SkDynamicMemoryWStream buffer;
SkDeflateWStream deflateWStream(&buffer);
// Since emitObject is const, this function doesn't change the dictionary.
@@ -467,6 +496,7 @@ void SkPDFSharedStream::emitObject(
void SkPDFSharedStream::addResources(
SkPDFObjNumMap* catalog, const SkPDFSubstituteMap& substitutes) const {
+ SkASSERT(!fDumped);
fDict->addResources(catalog, substitutes);
}
@@ -496,7 +526,7 @@ bool SkPDFObjNumMap::addObject(SkPDFObject* obj) {
return false;
}
fObjectNumbers.set(obj, fObjectNumbers.count() + 1);
- fObjects.push(obj);
+ fObjects.emplace_back(sk_ref_sp(obj));
return true;
}
« no previous file with comments | « src/pdf/SkPDFTypes.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698