[poppler] 3 commits - poppler/Decrypt.cc poppler/Decrypt.h poppler/Parser.cc poppler/PDFDoc.cc poppler/PDFDoc.h poppler/XRef.cc poppler/XRef.h
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Aug 13 17:44:23 UTC 2019
poppler/Decrypt.cc | 30 ++++++++++++-------------
poppler/Decrypt.h | 8 +++---
poppler/PDFDoc.cc | 62 +++++++++++++++++++++++++++++------------------------
poppler/PDFDoc.h | 15 ++++++++----
poppler/Parser.cc | 4 +--
poppler/XRef.cc | 5 ++++
poppler/XRef.h | 1
7 files changed, 71 insertions(+), 54 deletions(-)
New commits:
commit d70f77ee6a1bdee8b17f08f3066c0cd685853d21
Author: Albert Astals Cid <aacid at kde.org>
Date: Tue Aug 13 10:55:09 2019 +0200
Decrypt: take a Ref instead of two int
diff --git a/poppler/Decrypt.cc b/poppler/Decrypt.cc
index 16476f4f..6d9c14f2 100644
--- a/poppler/Decrypt.cc
+++ b/poppler/Decrypt.cc
@@ -305,7 +305,7 @@ bool Decrypt::makeFileKey2(int encVersion, int encRevision, int keyLength,
//------------------------------------------------------------------------
BaseCryptStream::BaseCryptStream(Stream *strA, const unsigned char *fileKey, CryptAlgorithm algoA,
- int keyLength, int objNum, int objGen):
+ int keyLength, Ref refA):
FilterStream(strA)
{
algo = algoA;
@@ -321,11 +321,11 @@ BaseCryptStream::BaseCryptStream(Stream *strA, const unsigned char *fileKey, Cry
switch (algo) {
case cryptRC4:
if (likely(keyLength < static_cast<int>(sizeof(objKey) - 4))) {
- objKey[keyLength] = objNum & 0xff;
- objKey[keyLength + 1] = (objNum >> 8) & 0xff;
- objKey[keyLength + 2] = (objNum >> 16) & 0xff;
- objKey[keyLength + 3] = objGen & 0xff;
- objKey[keyLength + 4] = (objGen >> 8) & 0xff;
+ objKey[keyLength] = refA.num & 0xff;
+ objKey[keyLength + 1] = (refA.num >> 8) & 0xff;
+ objKey[keyLength + 2] = (refA.num >> 16) & 0xff;
+ objKey[keyLength + 3] = refA.gen & 0xff;
+ objKey[keyLength + 4] = (refA.gen >> 8) & 0xff;
md5(objKey, keyLength + 5, objKey);
}
if ((objKeyLength = keyLength + 5) > 16) {
@@ -333,11 +333,11 @@ BaseCryptStream::BaseCryptStream(Stream *strA, const unsigned char *fileKey, Cry
}
break;
case cryptAES:
- objKey[keyLength] = objNum & 0xff;
- objKey[keyLength + 1] = (objNum >> 8) & 0xff;
- objKey[keyLength + 2] = (objNum >> 16) & 0xff;
- objKey[keyLength + 3] = objGen & 0xff;
- objKey[keyLength + 4] = (objGen >> 8) & 0xff;
+ objKey[keyLength] = refA.num & 0xff;
+ objKey[keyLength + 1] = (refA.num >> 8) & 0xff;
+ objKey[keyLength + 2] = (refA.num >> 16) & 0xff;
+ objKey[keyLength + 3] = refA.gen & 0xff;
+ objKey[keyLength + 4] = (refA.gen >> 8) & 0xff;
objKey[keyLength + 5] = 0x73; // 's'
objKey[keyLength + 6] = 0x41; // 'A'
objKey[keyLength + 7] = 0x6c; // 'l'
@@ -397,8 +397,8 @@ void BaseCryptStream::setAutoDelete(bool val) {
//------------------------------------------------------------------------
EncryptStream::EncryptStream(Stream *strA, const unsigned char *fileKey, CryptAlgorithm algoA,
- int keyLength, int objNum, int objGen):
- BaseCryptStream(strA, fileKey, algoA, keyLength, objNum, objGen)
+ int keyLength, Ref refA):
+ BaseCryptStream(strA, fileKey, algoA, keyLength, refA)
{
// Fill the CBC initialization vector for AES and AES-256
switch (algo) {
@@ -489,8 +489,8 @@ int EncryptStream::lookChar() {
//------------------------------------------------------------------------
DecryptStream::DecryptStream(Stream *strA, const unsigned char *fileKey, CryptAlgorithm algoA,
- int keyLength, int objNum, int objGen):
- BaseCryptStream(strA, fileKey, algoA, keyLength, objNum, objGen)
+ int keyLength, Ref refA):
+ BaseCryptStream(strA, fileKey, algoA, keyLength, refA)
{
}
diff --git a/poppler/Decrypt.h b/poppler/Decrypt.h
index d4667c8c..fbd135fc 100644
--- a/poppler/Decrypt.h
+++ b/poppler/Decrypt.h
@@ -17,7 +17,7 @@
// Copyright (C) 2009 David Benjamin <davidben at mit.edu>
// Copyright (C) 2012 Fabio D'Urso <fabiodurso at hotmail.it>
// Copyright (C) 2013 Adrian Johnson <ajohnson at redneon.com>
-// Copyright (C) 2013, 2018 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2013, 2018, 2019 Albert Astals Cid <aacid at kde.org>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag at alfa.de>
//
// To see a description of the changes please see the Changelog file that
@@ -99,7 +99,7 @@ class BaseCryptStream : public FilterStream {
public:
BaseCryptStream(Stream *strA, const unsigned char *fileKey, CryptAlgorithm algoA,
- int keyLength, int objNum, int objGen);
+ int keyLength, Ref ref);
~BaseCryptStream();
StreamKind getKind() override { return strCrypt; }
void reset() override;
@@ -133,7 +133,7 @@ class EncryptStream : public BaseCryptStream {
public:
EncryptStream(Stream *strA, const unsigned char *fileKey, CryptAlgorithm algoA,
- int keyLength, int objNum, int objGen);
+ int keyLength, Ref ref);
~EncryptStream();
void reset() override;
int lookChar() override;
@@ -143,7 +143,7 @@ class DecryptStream : public BaseCryptStream {
public:
DecryptStream(Stream *strA, const unsigned char *fileKey, CryptAlgorithm algoA,
- int keyLength, int objNum, int objGen);
+ int keyLength, Ref ref);
~DecryptStream();
void reset() override;
int lookChar() override;
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index aafba58d..dd619c62 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -1308,7 +1308,7 @@ void PDFDoc::writeString (const GooString* s, OutStream* outStr, const unsigned
GooString *sEnc = nullptr;
if (fileKey) {
EncryptStream *enc = new EncryptStream(new MemStream(s->c_str(), 0, s->getLength(), Object(objNull)),
- fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
+ fileKey, encAlgorithm, keyLength, ref);
sEnc = new GooString();
int c;
enc->reset();
@@ -1440,12 +1440,12 @@ void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, unsigned i
}
}
if (removeFilter) {
- encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
+ encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, ref);
encStream->setAutoDelete(false);
stream = encStream;
}
} else {
- encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
+ encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, ref);
encStream->setAutoDelete(false);
stream = encStream;
}
@@ -1453,7 +1453,7 @@ void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, unsigned i
removeFilter = false;
}
} else if (fileKey != nullptr) { // Encrypt stream
- encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
+ encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, ref);
encStream->setAutoDelete(false);
stream = encStream;
}
@@ -1476,7 +1476,7 @@ void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, unsigned i
writeStream (stream,outStr);
delete encStream;
} else if (fileKey != nullptr && stream->getKind() == strFile && static_cast<FileStream*>(stream)->getNeedsEncryptionOnSave()) {
- EncryptStream *encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
+ EncryptStream *encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, ref);
encStream->setAutoDelete(false);
writeDictionnary (encStream->getDict(), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, ref, alreadyWrittenDicts);
writeStream (encStream, outStr);
diff --git a/poppler/Parser.cc b/poppler/Parser.cc
index 0cb1f7fb..db839de8 100644
--- a/poppler/Parser.cc
+++ b/poppler/Parser.cc
@@ -172,7 +172,7 @@ Object Parser::getObj(bool simpleOnly,
s2 = new GooString();
decrypt = new DecryptStream(new MemStream(s->c_str(), 0, s->getLength(), Object(objNull)),
fileKey, encAlgorithm, keyLength,
- objNum, objGen);
+ {objNum, objGen});
decrypt->reset();
while ((c = decrypt->getChar()) != EOF) {
s2->append((char)c);
@@ -294,7 +294,7 @@ Stream *Parser::makeStream(Object &&dict, unsigned char *fileKey,
// handle decryption
if (fileKey) {
str = new DecryptStream(str, fileKey, encAlgorithm, keyLength,
- objNum, objGen);
+ {objNum, objGen});
}
// get filters
commit 242c53687ef5f685bb39fcc2b07d34f1443d2c75
Author: Albert Astals Cid <aacid at kde.org>
Date: Tue Aug 13 10:51:47 2019 +0200
PDFDoc: Add some overloads that take a Ref instead of two int
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index dfb1ac58..aafba58d 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -1127,7 +1127,7 @@ void PDFDoc::saveIncrementalUpdate (OutStream* outStr)
if (xref->getEntry(i)->type != xrefEntryFree) {
Object obj1 = xref->fetch(ref, 1 /* recursion */);
Goffset offset = writeObjectHeader(&ref, outStr);
- writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
+ writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref);
writeObjectFooter(outStr);
uxref->add(ref, offset, true);
} else {
@@ -1209,7 +1209,7 @@ void PDFDoc::saveCompleteRewrite (OutStream* outStr)
if (xref->getEntry(i)->getFlag(XRefEntry::Unencrypted)) {
writeObject(&obj1, outStr, nullptr, cryptRC4, 0, 0, 0);
} else {
- writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
+ writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref);
}
writeObjectFooter(outStr);
uxref->add(ref, offset, true);
@@ -1218,7 +1218,7 @@ void PDFDoc::saveCompleteRewrite (OutStream* outStr)
ref.gen = 0; //compressed entries have gen == 0
Object obj1 = xref->fetch(ref, 1 /* recursion */);
Goffset offset = writeObjectHeader(&ref, outStr);
- writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
+ writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref);
writeObjectFooter(outStr);
uxref->add(ref, offset, true);
}
@@ -1231,7 +1231,7 @@ void PDFDoc::saveCompleteRewrite (OutStream* outStr)
}
void PDFDoc::writeDictionnary (Dict* dict, OutStream* outStr, XRef *xRef, unsigned int numOffset, unsigned char *fileKey,
- CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen, std::set<Dict*> *alreadyWrittenDicts)
+ CryptAlgorithm encAlgorithm, int keyLength, Ref ref, std::set<Dict*> *alreadyWrittenDicts)
{
bool deleteSet = false;
if (!alreadyWrittenDicts) {
@@ -1254,7 +1254,7 @@ void PDFDoc::writeDictionnary (Dict* dict, OutStream* outStr, XRef *xRef, unsign
outStr->printf("/%s ", keyNameToPrint->c_str());
delete keyNameToPrint;
Object obj1 = dict->getValNF(i).copy();
- writeObject(&obj1, outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen, alreadyWrittenDicts);
+ writeObject(&obj1, outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, ref, alreadyWrittenDicts);
}
outStr->printf(">> ");
@@ -1302,13 +1302,13 @@ void PDFDoc::writeRawStream (Stream* str, OutStream* outStr)
}
void PDFDoc::writeString (const GooString* s, OutStream* outStr, const unsigned char *fileKey,
- CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen)
+ CryptAlgorithm encAlgorithm, int keyLength, Ref ref)
{
// Encrypt string if encryption is enabled
GooString *sEnc = nullptr;
if (fileKey) {
EncryptStream *enc = new EncryptStream(new MemStream(s->c_str(), 0, s->getLength(), Object(objNull)),
- fileKey, encAlgorithm, keyLength, objNum, objGen);
+ fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
sEnc = new GooString();
int c;
enc->reset();
@@ -1366,6 +1366,12 @@ Goffset PDFDoc::writeObjectHeader (Ref *ref, OutStream* outStr)
void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, unsigned int numOffset, unsigned char *fileKey,
CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen, std::set<Dict*> *alreadyWrittenDicts)
{
+ writeObject(obj, outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, {objNum, objGen}, alreadyWrittenDicts);
+}
+
+void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, unsigned int numOffset, unsigned char *fileKey,
+ CryptAlgorithm encAlgorithm, int keyLength, Ref ref, std::set<Dict*> *alreadyWrittenDicts)
+{
Array *array;
switch (obj->getType()) {
@@ -1386,7 +1392,7 @@ void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, unsigned i
break;
}
case objString:
- writeString(obj->getString(), outStr, fileKey, encAlgorithm, keyLength, objNum, objGen);
+ writeString(obj->getString(), outStr, fileKey, encAlgorithm, keyLength, ref);
break;
case objName:
{
@@ -1404,12 +1410,12 @@ void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, unsigned i
outStr->printf("[");
for (int i=0; i<array->getLength(); i++) {
Object obj1 = array->getNF(i).copy();
- writeObject(&obj1, outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen);
+ writeObject(&obj1, outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, ref);
}
outStr->printf("] ");
break;
case objDict:
- writeDictionnary (obj->getDict(), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen, alreadyWrittenDicts);
+ writeDictionnary (obj->getDict(), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, ref, alreadyWrittenDicts);
break;
case objStream:
{
@@ -1434,12 +1440,12 @@ void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, unsigned i
}
}
if (removeFilter) {
- encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, objNum, objGen);
+ encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
encStream->setAutoDelete(false);
stream = encStream;
}
} else {
- encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, objNum, objGen);
+ encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
encStream->setAutoDelete(false);
stream = encStream;
}
@@ -1447,7 +1453,7 @@ void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, unsigned i
removeFilter = false;
}
} else if (fileKey != nullptr) { // Encrypt stream
- encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, objNum, objGen);
+ encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
encStream->setAutoDelete(false);
stream = encStream;
}
@@ -1466,13 +1472,13 @@ void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, unsigned i
}
stream->getDict()->remove("DecodeParms");
- writeDictionnary (stream->getDict(),outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen, alreadyWrittenDicts);
+ writeDictionnary (stream->getDict(),outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, ref, alreadyWrittenDicts);
writeStream (stream,outStr);
delete encStream;
} else if (fileKey != nullptr && stream->getKind() == strFile && static_cast<FileStream*>(stream)->getNeedsEncryptionOnSave()) {
- EncryptStream *encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, objNum, objGen);
+ EncryptStream *encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
encStream->setAutoDelete(false);
- writeDictionnary (encStream->getDict(), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen, alreadyWrittenDicts);
+ writeDictionnary (encStream->getDict(), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, ref, alreadyWrittenDicts);
writeStream (encStream, outStr);
delete encStream;
} else {
@@ -1488,7 +1494,7 @@ void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, unsigned i
}
}
}
- writeDictionnary (stream->getDict(), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen, alreadyWrittenDicts);
+ writeDictionnary (stream->getDict(), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, ref, alreadyWrittenDicts);
writeRawStream (stream, outStr);
}
break;
@@ -1609,7 +1615,7 @@ void PDFDoc::writeXRefTableTrailer(Object &&trailerDict, XRef *uxref, bool write
{
uxref->writeTableToFile( outStr, writeAllEntries );
outStr->printf( "trailer\r\n");
- writeDictionnary(trailerDict.getDict(), outStr, xRef, 0, nullptr, cryptRC4, 0, 0, 0, nullptr);
+ writeDictionnary(trailerDict.getDict(), outStr, xRef, 0, nullptr, cryptRC4, 0, {0, 0}, nullptr);
outStr->printf( "\r\nstartxref\r\n");
outStr->printf( "%lli\r\n", uxrefOffset);
outStr->printf( "%%%%EOF\r\n");
@@ -1949,7 +1955,7 @@ unsigned int PDFDoc::writePageObjects(OutStream *outStr, XRef *xRef, unsigned in
} else if (xRef->getEntry(n)->getFlag(XRefEntry::Unencrypted)) {
writeObject(&obj, outStr, nullptr, cryptRC4, 0, 0, 0);
} else {
- writeObject(&obj, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
+ writeObject(&obj, outStr, fileKey, encAlgorithm, keyLength, ref);
}
writeObjectFooter(outStr);
xRef->add(ref, offset, true);
diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h
index 3c62903a..ba64296e 100644
--- a/poppler/PDFDoc.h
+++ b/poppler/PDFDoc.h
@@ -338,6 +338,8 @@ public:
unsigned int writePageObjects(OutStream *outStr, XRef *xRef, unsigned int numOffset, bool combine = false);
static void writeObject (Object *obj, OutStream* outStr, XRef *xref, unsigned int numOffset, unsigned char *fileKey,
CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen, std::set<Dict*> *alreadyWrittenDicts = nullptr);
+ static void writeObject (Object *obj, OutStream* outStr, XRef *xref, unsigned int numOffset, unsigned char *fileKey,
+ CryptAlgorithm encAlgorithm, int keyLength, Ref ref, std::set<Dict*> *alreadyWrittenDicts = nullptr);
static void writeHeader(OutStream *outStr, int major, int minor);
static Object createTrailerDict (int uxrefSize, bool incrUpdate, Goffset startxRef,
@@ -352,21 +354,24 @@ private:
void markDictionnary (Dict* dict, XRef *xRef, XRef *countRef, unsigned int numOffset, int oldRefNum, int newRefNum, std::set<Dict*> *alreadyMarkedDicts);
void markObject (Object *obj, XRef *xRef, XRef *countRef, unsigned int numOffset, int oldRefNum, int newRefNum, std::set<Dict*> *alreadyMarkedDicts = nullptr);
static void writeDictionnary (Dict* dict, OutStream* outStr, XRef *xRef, unsigned int numOffset, unsigned char *fileKey,
- CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen, std::set<Dict*> *alreadyWrittenDicts);
+ CryptAlgorithm encAlgorithm, int keyLength, Ref ref, std::set<Dict*> *alreadyWrittenDicts);
// Write object header to current file stream and return its offset
static Goffset writeObjectHeader (Ref *ref, OutStream* outStr);
static void writeObjectFooter (OutStream* outStr);
- void writeObject (Object *obj, OutStream* outStr, unsigned char *fileKey, CryptAlgorithm encAlgorithm,
- int keyLength, int objNum, int objGen, std::set<Dict*> *alreadyWrittenDicts = nullptr)
- { writeObject(obj, outStr, getXRef(), 0, fileKey, encAlgorithm, keyLength, objNum, objGen, alreadyWrittenDicts); }
+ inline void writeObject (Object *obj, OutStream* outStr, unsigned char *fileKey, CryptAlgorithm encAlgorithm,
+ int keyLength, int objNum, int objGen)
+ { writeObject(obj, outStr, getXRef(), 0, fileKey, encAlgorithm, keyLength, {objNum, objGen}); }
+ inline void writeObject (Object *obj, OutStream* outStr, unsigned char *fileKey, CryptAlgorithm encAlgorithm,
+ int keyLength, Ref ref)
+ { writeObject(obj, outStr, getXRef(), 0, fileKey, encAlgorithm, keyLength, ref); }
static void writeStream (Stream* str, OutStream* outStr);
static void writeRawStream (Stream* str, OutStream* outStr);
void writeXRefTableTrailer (Goffset uxrefOffset, XRef *uxref, bool writeAllEntries,
int uxrefSize, OutStream* outStr, bool incrUpdate);
static void writeString (const GooString* s, OutStream* outStr, const unsigned char *fileKey,
- CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen);
+ CryptAlgorithm encAlgorithm, int keyLength, Ref ref);
void saveIncrementalUpdate (OutStream* outStr);
void saveCompleteRewrite (OutStream* outStr);
commit 3a4a593146e614c31628f9327b2bc1320ac8caa5
Author: Albert Astals Cid <aacid at kde.org>
Date: Tue Aug 13 10:25:09 2019 +0200
XRef: add XRef::add overload that takes a Ref
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index ab4abcad..dfb1ac58 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -927,7 +927,7 @@ int PDFDoc::savePageAs(const GooString *name, int pageNo)
Dict *trailerDict = trailerObj->getDict();
const Object &ref = trailerDict->lookupNF("Info");
if (ref.isRef()) {
- yRef->add(ref.getRef().num, ref.getRef().gen, 0, true);
+ yRef->add(ref.getRef(), 0, true);
if (getXRef()->getEntry(ref.getRef().num)->type == xrefEntryCompressed) {
yRef->getEntry(ref.getRef().num)->type = xrefEntryCompressed;
}
@@ -1129,9 +1129,9 @@ void PDFDoc::saveIncrementalUpdate (OutStream* outStr)
Goffset offset = writeObjectHeader(&ref, outStr);
writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
writeObjectFooter(outStr);
- uxref->add(ref.num, ref.gen, offset, true);
+ uxref->add(ref, offset, true);
} else {
- uxref->add(ref.num, ref.gen, 0, false);
+ uxref->add(ref, 0, false);
}
}
}
@@ -1157,7 +1157,7 @@ void PDFDoc::saveIncrementalUpdate (OutStream* outStr)
// Append an entry for the xref stream itself
uxrefStreamRef.num = numobjects++;
uxrefStreamRef.gen = 0;
- uxref->add(uxrefStreamRef.num, uxrefStreamRef.gen, uxrefOffset, true);
+ uxref->add(uxrefStreamRef, uxrefOffset, true);
}
Object trailerDict = createTrailerDict(numobjects, true, getStartXRef(), &rootRef, getXRef(), fileNameA, uxrefOffset);
@@ -1194,12 +1194,12 @@ void PDFDoc::saveCompleteRewrite (OutStream* outStr)
/* the XRef class adds a lot of irrelevant free entries, we only want the significant one
and we don't want the one with num=0 because it has already been added (gen = 65535)*/
if (ref.gen > 0 && ref.num > 0)
- uxref->add(ref.num, ref.gen, 0, false);
+ uxref->add(ref, 0, false);
} else if (xref->getEntry(i)->getFlag(XRefEntry::DontRewrite)) {
// This entry must not be written, put a free entry instead (with incremented gen)
ref.num = i;
ref.gen = xref->getEntry(i)->gen + 1;
- uxref->add(ref.num, ref.gen, 0, false);
+ uxref->add(ref, 0, false);
} else if (type == xrefEntryUncompressed){
ref.num = i;
ref.gen = xref->getEntry(i)->gen;
@@ -1212,7 +1212,7 @@ void PDFDoc::saveCompleteRewrite (OutStream* outStr)
writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
}
writeObjectFooter(outStr);
- uxref->add(ref.num, ref.gen, offset, true);
+ uxref->add(ref, offset, true);
} else if (type == xrefEntryCompressed) {
ref.num = i;
ref.gen = 0; //compressed entries have gen == 0
@@ -1220,7 +1220,7 @@ void PDFDoc::saveCompleteRewrite (OutStream* outStr)
Goffset offset = writeObjectHeader(&ref, outStr);
writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
writeObjectFooter(outStr);
- uxref->add(ref.num, ref.gen, offset, true);
+ uxref->add(ref, offset, true);
}
}
xref->unlock();
@@ -1952,7 +1952,7 @@ unsigned int PDFDoc::writePageObjects(OutStream *outStr, XRef *xRef, unsigned in
writeObject(&obj, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
}
writeObjectFooter(outStr);
- xRef->add(ref.num, ref.gen, offset, true);
+ xRef->add(ref, offset, true);
}
}
return objectsCount;
diff --git a/poppler/XRef.cc b/poppler/XRef.cc
index 87a08c7d..22ce7f9b 100644
--- a/poppler/XRef.cc
+++ b/poppler/XRef.cc
@@ -1264,6 +1264,11 @@ int XRef::getNumEntry(Goffset offset)
else return -1;
}
+void XRef::add(Ref ref, Goffset offs, bool used)
+{
+ add(ref.num, ref.gen, offs, used);
+}
+
void XRef::add(int num, int gen, Goffset offs, bool used) {
xrefLocker();
if (num >= size) {
diff --git a/poppler/XRef.h b/poppler/XRef.h
index eb8684d3..fc5c8388 100644
--- a/poppler/XRef.h
+++ b/poppler/XRef.h
@@ -193,6 +193,7 @@ public:
Ref addIndirectObject (const Object* o);
void removeIndirectObject(Ref r);
void add(int num, int gen, Goffset offs, bool used);
+ void add(Ref ref, Goffset offs, bool used);
// Output XRef table to stream
void writeTableToFile(OutStream* outStr, bool writeAllEntries);
More information about the poppler
mailing list