diff options
Diffstat (limited to 'Build/source/libs/poppler/poppler-src/poppler/Page.cc')
-rw-r--r-- | Build/source/libs/poppler/poppler-src/poppler/Page.cc | 203 |
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; } |