summaryrefslogtreecommitdiff
path: root/Build/source/libs/poppler/poppler-src/poppler/Page.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/poppler/poppler-src/poppler/Page.cc')
-rw-r--r--Build/source/libs/poppler/poppler-src/poppler/Page.cc203
1 files changed, 73 insertions, 130 deletions
diff --git a/Build/source/libs/poppler/poppler-src/poppler/Page.cc b/Build/source/libs/poppler/poppler-src/poppler/Page.cc
index dca52e4faae..ca4a5a6d4d0 100644
--- a/Build/source/libs/poppler/poppler-src/poppler/Page.cc
+++ b/Build/source/libs/poppler/poppler-src/poppler/Page.cc
@@ -15,7 +15,7 @@
//
// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
// Copyright (C) 2005 Jeff Muizelaar <jeff@infidigm.net>
-// Copyright (C) 2005-2013, 2016 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005-2013, 2016, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2006-2008 Pino Toscano <pino@kde.org>
// Copyright (C) 2006 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
// Copyright (C) 2006 Scott Turner <scotty1024@mac.com>
@@ -27,7 +27,7 @@
// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it>
// Copyright (C) 2013, 2014 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2013 Jason Crain <jason@aquaticape.us>
-// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com>
+// Copyright (C) 2013, 2017 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2015 Philipp Reinkemeier <philipp.reinkemeier@offis.de>
//
// To see a description of the changes please see the Changelog file that
@@ -61,7 +61,7 @@
#include "Catalog.h"
#include "Form.h"
-#if MULTITHREADED
+#ifdef MULTITHREADED
# define pageLocker() MutexLocker locker(&mutex)
#else
# define pageLocker()
@@ -108,7 +108,7 @@ PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) {
cropBox = attrs->cropBox;
haveCropBox = attrs->haveCropBox;
rotate = attrs->rotate;
- attrs->resources.copy(&resources);
+ resources = attrs->resources.copy();
} else {
// set default MediaBox to 8.5" x 11" -- this shouldn't be necessary
// but some (non-compliant) PDF files don't specify a MediaBox
@@ -119,7 +119,7 @@ PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) {
cropBox.x1 = cropBox.y1 = cropBox.x2 = cropBox.y2 = 0;
haveCropBox = gFalse;
rotate = 0;
- resources.initNull();
+ resources.setToNull();
}
// media box
@@ -158,11 +158,10 @@ PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) {
readBox(dict, "ArtBox", &artBox);
// rotate
- dict->lookup("Rotate", &obj1);
+ obj1 = dict->lookup("Rotate");
if (obj1.isInt()) {
rotate = obj1.getInt();
}
- obj1.free();
while (rotate < 0) {
rotate += 360;
}
@@ -171,30 +170,21 @@ PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) {
}
// misc attributes
- dict->lookup("LastModified", &lastModified);
- dict->lookup("BoxColorInfo", &boxColorInfo);
- dict->lookup("Group", &group);
- dict->lookup("Metadata", &metadata);
- dict->lookup("PieceInfo", &pieceInfo);
- dict->lookup("SeparationInfo", &separationInfo);
+ lastModified = dict->lookup("LastModified");
+ boxColorInfo = dict->lookup("BoxColorInfo");
+ group = dict->lookup("Group");
+ metadata = dict->lookup("Metadata");
+ pieceInfo = dict->lookup("PieceInfo");
+ separationInfo = dict->lookup("SeparationInfo");
// resource dictionary
- dict->lookup("Resources", &obj1);
+ obj1 = dict->lookup("Resources");
if (obj1.isDict()) {
- resources.free();
- obj1.copy(&resources);
+ resources = obj1.copy();
}
- obj1.free();
}
PageAttrs::~PageAttrs() {
- lastModified.free();
- boxColorInfo.free();
- group.free();
- metadata.free();
- pieceInfo.free();
- separationInfo.free();
- resources.free();
}
void PageAttrs::clipBoxes() {
@@ -210,37 +200,33 @@ GBool PageAttrs::readBox(Dict *dict, const char *key, PDFRectangle *box) {
Object obj1, obj2;
GBool ok;
- dict->lookup(key, &obj1);
+ obj1 = dict->lookup(key);
if (obj1.isArray() && obj1.arrayGetLength() == 4) {
ok = gTrue;
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
if (obj2.isNum()) {
tmp.x1 = obj2.getNum();
} else {
ok = gFalse;
}
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
if (obj2.isNum()) {
tmp.y1 = obj2.getNum();
} else {
ok = gFalse;
}
- obj2.free();
- obj1.arrayGet(2, &obj2);
+ obj2 = obj1.arrayGet(2);
if (obj2.isNum()) {
tmp.x2 = obj2.getNum();
} else {
ok = gFalse;
}
- obj2.free();
- obj1.arrayGet(3, &obj2);
+ obj2 = obj1.arrayGet(3);
if (obj2.isNum()) {
tmp.y2 = obj2.getNum();
} else {
ok = gFalse;
}
- obj2.free();
if (tmp.x1 == 0 && tmp.x2 == 0 && tmp.y1 == 0 && tmp.y2 == 0)
ok = gFalse;
if (ok) {
@@ -255,7 +241,6 @@ GBool PageAttrs::readBox(Dict *dict, const char *key, PDFRectangle *box) {
} else {
ok = gFalse;
}
- obj1.free();
return ok;
}
@@ -263,10 +248,8 @@ GBool PageAttrs::readBox(Dict *dict, const char *key, PDFRectangle *box) {
// Page
//------------------------------------------------------------------------
-Page::Page(PDFDoc *docA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form) {
- Object tmp;
-
-#if MULTITHREADED
+Page::Page(PDFDoc *docA, int numA, Object *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form) {
+#ifdef MULTITHREADED
gInitMutex(&mutex);
#endif
ok = gTrue;
@@ -276,7 +259,7 @@ Page::Page(PDFDoc *docA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attr
duration = -1;
annots = NULL;
- pageObj.initDict(pageDict);
+ pageObj = pageDict->copy();
pageRef = pageRefA;
// get attributes
@@ -284,80 +267,68 @@ Page::Page(PDFDoc *docA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attr
attrs->clipBoxes();
// transtion
- pageDict->lookupNF("Trans", &trans);
+ trans = pageDict->dictLookupNF("Trans");
if (!(trans.isRef() || trans.isDict() || trans.isNull())) {
error(errSyntaxError, -1, "Page transition object (page {0:d}) is wrong type ({1:s})",
num, trans.getTypeName());
- trans.free();
+ trans = Object();
}
// duration
- pageDict->lookupNF("Dur", &tmp);
+ Object tmp = pageDict->dictLookupNF("Dur");
if (!(tmp.isNum() || tmp.isNull())) {
error(errSyntaxError, -1, "Page duration object (page {0:d}) is wrong type ({1:s})",
num, tmp.getTypeName());
} else if (tmp.isNum()) {
duration = tmp.getNum();
}
- tmp.free();
// annotations
- pageDict->lookupNF("Annots", &annotsObj);
+ annotsObj = pageDict->dictLookupNF("Annots");
if (!(annotsObj.isRef() || annotsObj.isArray() || annotsObj.isNull())) {
error(errSyntaxError, -1, "Page annotations object (page {0:d}) is wrong type ({1:s})",
num, annotsObj.getTypeName());
- annotsObj.free();
goto err2;
}
// contents
- pageDict->lookupNF("Contents", &contents);
+ contents = pageDict->dictLookupNF("Contents");
if (!(contents.isRef() || contents.isArray() ||
contents.isNull())) {
error(errSyntaxError, -1, "Page contents object (page {0:d}) is wrong type ({1:s})",
num, contents.getTypeName());
- contents.free();
goto err1;
}
// thumb
- pageDict->lookupNF("Thumb", &thumb);
+ thumb = pageDict->dictLookupNF("Thumb");
if (!(thumb.isStream() || thumb.isNull() || thumb.isRef())) {
error(errSyntaxError, -1, "Page thumb object (page {0:d}) is wrong type ({1:s})",
num, thumb.getTypeName());
- thumb.free();
- thumb.initNull();
+ thumb.setToNull();
}
// actions
- pageDict->lookupNF("AA", &actions);
+ actions = pageDict->dictLookupNF("AA");
if (!(actions.isDict() || actions.isNull())) {
error(errSyntaxError, -1, "Page additional action object (page {0:d}) is wrong type ({1:s})",
num, actions.getTypeName());
- actions.free();
- actions.initNull();
+ actions.setToNull();
}
return;
- trans.initNull();
err2:
- annotsObj.initNull();
+ annotsObj.setToNull();
err1:
- contents.initNull();
+ contents.setToNull();
ok = gFalse;
}
Page::~Page() {
delete attrs;
delete annots;
- pageObj.free();
- annotsObj.free();
- contents.free();
- trans.free();
- thumb.free();
- actions.free();
-#if MULTITHREADED
+#ifdef MULTITHREADED
gDestroyMutex(&mutex);
#endif
}
@@ -366,6 +337,11 @@ Dict *Page::getResourceDict() {
return attrs->getResourceDict();
}
+Object *Page::getResourceDictObject()
+{
+ return attrs->getResourceDictObject();
+}
+
Dict *Page::getResourceDictCopy(XRef *xrefA) {
pageLocker();
Dict *dict = attrs->getResourceDict();
@@ -376,42 +352,32 @@ void Page::replaceXRef(XRef *xrefA) {
Object obj1;
Dict *pageDict = pageObj.getDict()->copy(xrefA);
xref = xrefA;
- trans.free();
- pageDict->lookupNF("Trans", &trans);
- annotsObj.free();
- pageDict->lookupNF("Annots", &annotsObj);
- contents.free();
- pageDict->lookupNF("Contents", &contents);
+ trans = pageDict->lookupNF("Trans");
+ annotsObj = pageDict->lookupNF("Annots");
+ contents = pageDict->lookupNF("Contents");
if (contents.isArray()) {
- contents.free();
- pageDict->lookupNF("Contents", &obj1)->getArray()->copy(xrefA, &contents);
- obj1.free();
- }
- thumb.free();
- pageDict->lookupNF("Thumb", &thumb);
- actions.free();
- pageDict->lookupNF("AA", &actions);
- pageDict->lookup("Resources", &obj1);
+ obj1 = pageDict->lookupNF("Contents");
+ contents = obj1.getArray()->copy(xrefA);
+ }
+ thumb = pageDict->lookupNF("Thumb");
+ actions = pageDict->lookupNF("AA");
+ obj1 = pageDict->lookup("Resources");
if (obj1.isDict()) {
- attrs->replaceResource(obj1);
+ attrs->replaceResource(std::move(obj1));
}
- obj1.free();
delete pageDict;
}
Annots *Page::getAnnots(XRef *xrefA) {
if (!annots) {
- Object obj;
- annots = new Annots(doc, num, getAnnots(&obj, (xrefA == NULL) ? xref : xrefA));
- obj.free();
+ Object obj = getAnnotsObject(xrefA);
+ annots = new Annots(doc, num, &obj);
}
return annots;
}
void Page::addAnnot(Annot *annot) {
- Object obj1;
- Object tmp;
Ref annotRef = annot->getRef ();
// Make sure we have annots before adding the new one
@@ -425,24 +391,22 @@ void Page::addAnnot(Annot *annot) {
// page doesn't have annots array,
// we have to create it
- obj1.initArray(xref);
- obj1.arrayAdd(tmp.initRef (annotRef.num, annotRef.gen));
- tmp.free();
+ Object obj1 = Object(new Array(xref));
+ obj1.arrayAdd(Object(annotRef.num, annotRef.gen));
annotsRef = xref->addIndirectObject (&obj1);
- annotsObj.initRef(annotsRef.num, annotsRef.gen);
- pageObj.dictSet ("Annots", &annotsObj);
+ annotsObj = Object(annotsRef.num, annotsRef.gen);
+ pageObj.dictSet ("Annots", Object(annotsRef.num, annotsRef.gen));
xref->setModifiedObject (&pageObj, pageRef);
} else {
- getAnnots(&obj1);
+ Object obj1 = getAnnotsObject();
if (obj1.isArray()) {
- obj1.arrayAdd (tmp.initRef (annotRef.num, annotRef.gen));
+ obj1.arrayAdd (Object(annotRef.num, annotRef.gen));
if (annotsObj.isRef())
xref->setModifiedObject (&obj1, annotsObj.getRef());
else
xref->setModifiedObject (&pageObj, pageRef);
}
- obj1.free();
}
// Popup annots are already handled by markup annots,
@@ -464,27 +428,24 @@ void Page::addAnnot(Annot *annot) {
void Page::removeAnnot(Annot *annot) {
Ref annotRef = annot->getRef();
- Object annArray;
pageLocker();
- getAnnots(&annArray);
+ Object annArray = getAnnotsObject();
if (annArray.isArray()) {
int idx = -1;
// Get annotation position
for (int i = 0; idx == -1 && i < annArray.arrayGetLength(); ++i) {
- Object tmp;
- if (annArray.arrayGetNF(i, &tmp)->isRef()) {
+ Object tmp = annArray.arrayGetNF(i);
+ if (tmp.isRef()) {
Ref currAnnot = tmp.getRef();
if (currAnnot.num == annotRef.num && currAnnot.gen == annotRef.gen) {
idx = i;
}
}
- tmp.free();
}
if (idx == -1) {
error(errInternal, -1, "Annotation doesn't belong to this page");
- annArray.free();
return;
}
annots->removeAnnot(annot); // Gracefully fails on popup windows
@@ -497,7 +458,6 @@ void Page::removeAnnot(Annot *annot) {
xref->setModifiedObject (&pageObj, pageRef);
}
}
- annArray.free();
annot->removeReferencedObjects(); // Note: Might recurse in removeAnnot again
annot->setPage(0, gFalse);
}
@@ -573,7 +533,6 @@ void Page::displaySlice(OutputDev *out, double hDPI, double vDPI,
void *annotDisplayDecideCbkData,
GBool copyXRef) {
Gfx *gfx;
- Object obj;
Annots *annotList;
int i;
@@ -595,7 +554,7 @@ void Page::displaySlice(OutputDev *out, double hDPI, double vDPI,
printing,
abortCheckCbk, abortCheckCbkData, localXRef);
- contents.fetch(localXRef, &obj);
+ Object obj = contents.fetch(localXRef);
if (!obj.isNull()) {
gfx->saveState();
gfx->display(&obj);
@@ -605,7 +564,6 @@ void Page::displaySlice(OutputDev *out, double hDPI, double vDPI,
// OutputDev
out->dump();
}
- obj.free();
// draw annotations
annotList = getAnnots();
@@ -633,15 +591,12 @@ void Page::displaySlice(OutputDev *out, double hDPI, double vDPI,
}
void Page::display(Gfx *gfx) {
- Object obj;
-
- contents.fetch(xref, &obj);
+ Object obj = contents.fetch(xref);
if (!obj.isNull()) {
gfx->saveState();
gfx->display(&obj);
gfx->restoreState();
}
- obj.free();
}
GBool Page::loadThumb(unsigned char **data_out,
@@ -650,7 +605,7 @@ GBool Page::loadThumb(unsigned char **data_out,
{
unsigned int pixbufdatasize;
int width, height, bits;
- Object obj1, fetched_thumb;
+ Object obj1;
Dict *dict;
GfxColorSpace *colorSpace;
GBool success = gFalse;
@@ -659,9 +614,8 @@ GBool Page::loadThumb(unsigned char **data_out,
/* Get stream dict */
pageLocker();
- thumb.fetch(xref, &fetched_thumb);
+ Object fetched_thumb = thumb.fetch(xref);
if (!fetched_thumb.isStream()) {
- fetched_thumb.free();
return gFalse;
}
@@ -683,25 +637,21 @@ GBool Page::loadThumb(unsigned char **data_out,
pixbufdatasize = width * height * 3;
/* Get color space */
- dict->lookup ("ColorSpace", &obj1);
+ obj1 = dict->lookup ("ColorSpace");
if (obj1.isNull ()) {
- obj1.free ();
- dict->lookup ("CS", &obj1);
+ obj1 = dict->lookup ("CS");
}
colorSpace = GfxColorSpace::parse(NULL, &obj1, NULL, NULL);
- obj1.free();
if (!colorSpace) {
fprintf (stderr, "Error: Cannot parse color space\n");
goto fail1;
}
- dict->lookup("Decode", &obj1);
+ obj1 = dict->lookup("Decode");
if (obj1.isNull()) {
- obj1.free();
- dict->lookup("D", &obj1);
+ obj1 = dict->lookup("D");
}
colorMap = new GfxImageColorMap(bits, &obj1, colorSpace);
- obj1.free();
if (!colorMap->isOk()) {
fprintf (stderr, "Error: invalid colormap\n");
delete colorMap;
@@ -744,8 +694,6 @@ GBool Page::loadThumb(unsigned char **data_out,
delete colorMap;
fail1:
- fetched_thumb.free();
-
return success;
}
@@ -842,21 +790,16 @@ void Page::getDefaultCTM(double *ctm, double hDPI, double vDPI,
}
LinkAction* Page::getAdditionalAction(PageAdditionalActionsType type) {
- Object additionalActionsObject;
- LinkAction *linkAction = NULL;
-
- if (actions.fetch(doc->getXRef(), &additionalActionsObject)->isDict()) {
+ LinkAction *linkAction = nullptr;
+ Object additionalActionsObject = actions.fetch(doc->getXRef());
+ if (additionalActionsObject.isDict()) {
const char *key = (type == actionOpenPage ? "O" :
type == actionClosePage ? "C" : NULL);
- Object actionObject;
-
- if (additionalActionsObject.dictLookup(key, &actionObject)->isDict())
+ Object actionObject = additionalActionsObject.dictLookup(key);
+ if (actionObject.isDict())
linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI());
- actionObject.free();
}
- additionalActionsObject.free();
-
return linkAction;
}