annots: Use std::unique_ptr instead of new/delete
diff --git a/glib/poppler-annot.cc b/glib/poppler-annot.cc index 312aa31..936cc07 100644 --- a/glib/poppler-annot.cc +++ b/glib/poppler-annot.cc
@@ -267,25 +267,20 @@ static AnnotQuadrilaterals * create_annot_quads_from_poppler_quads (GArray *quads) { - AnnotQuadrilaterals::AnnotQuadrilateral **quads_array; - g_assert (quads->len > 0); - quads_array = (AnnotQuadrilaterals::AnnotQuadrilateral **) g_malloc0_n ( - sizeof (AnnotQuadrilaterals::AnnotQuadrilateral *), - quads->len); - + auto quads_array = std::make_unique<AnnotQuadrilaterals::AnnotQuadrilateral[]>(quads->len); for (guint i = 0; i < quads->len; i++) { PopplerQuadrilateral *quadrilateral = &g_array_index (quads, PopplerQuadrilateral, i); - quads_array[i] = new AnnotQuadrilaterals::AnnotQuadrilateral ( + quads_array[i] = AnnotQuadrilaterals::AnnotQuadrilateral ( quadrilateral->p1.x, quadrilateral->p1.y, quadrilateral->p2.x, quadrilateral->p2.y, quadrilateral->p3.x, quadrilateral->p3.y, quadrilateral->p4.x, quadrilateral->p4.y); } - return new AnnotQuadrilaterals (quads_array, quads->len); + return new AnnotQuadrilaterals (std::move(quads_array), quads->len); } static GArray * @@ -947,15 +942,15 @@ return poppler_color; } -static AnnotColor * +static std::unique_ptr<AnnotColor> create_annot_color_from_poppler_color (PopplerColor *poppler_color) { if (!poppler_color) - return NULL; + return nullptr; - return new AnnotColor ((double)poppler_color->red / 65535, - (double)poppler_color->green / 65535, - (double)poppler_color->blue / 65535); + return std::make_unique<AnnotColor>((double)poppler_color->red / 65535, + (double)poppler_color->green / 65535, + (double)poppler_color->blue / 65535); } /** @@ -988,7 +983,6 @@ poppler_annot_set_color (PopplerAnnot *poppler_annot, PopplerColor *poppler_color) { - /* Annot takes ownership of the color */ poppler_annot->annot->setColor (create_annot_color_from_poppler_color (poppler_color)); } @@ -1150,15 +1144,13 @@ PopplerRectangle *popup_rect) { AnnotMarkup *annot; - AnnotPopup *popup; PDFRectangle pdf_rect(popup_rect->x1, popup_rect->y1, popup_rect->x2, popup_rect->y2); g_return_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot)); annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot); - popup = new AnnotPopup (annot->getDoc(), &pdf_rect); - annot->setPopup (popup); + annot->setPopup (std::make_unique<AnnotPopup>(annot->getDoc(), &pdf_rect)); } /** @@ -1946,7 +1938,6 @@ annot = static_cast<AnnotGeometry *>(POPPLER_ANNOT (poppler_annot)->annot); - /* Annot takes ownership of the color */ annot->setInteriorColor (create_annot_color_from_poppler_color (poppler_color)); }
diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 7e1941c..6832735 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc
@@ -184,8 +184,7 @@ return type; } -PDFRectangle *parseDiffRectangle(Array *array, PDFRectangle *rect) { - PDFRectangle *newRect = NULL; +static std::unique_ptr<PDFRectangle> parseDiffRectangle(Array *array, PDFRectangle *rect) { if (array->getLength() == 4) { // deltas Object obj1; @@ -199,14 +198,15 @@ if (dx1 >= 0 && dy1 >= 0 && dx2 >= 0 && dy2 && (rect->x2 - rect->x1 - dx1 - dx2) >= 0 && (rect->y2 - rect->y1 - dy1 - dy2) >= 0) { - newRect = new PDFRectangle(); + auto newRect = std::make_unique<PDFRectangle>(); newRect->x1 = rect->x1 + dx1; newRect->y1 = rect->y1 + dy1; newRect->x2 = rect->x2 - dx2; newRect->y2 = rect->y2 - dy2; + return newRect; } } - return newRect; + return nullptr; } static LinkAction* getAdditionalAction(Annot::AdditionalActionsType type, Object *additionalActions, PDFDoc *doc) { @@ -283,51 +283,39 @@ //------------------------------------------------------------------------ AnnotPath::AnnotPath() { - coords = NULL; coordsLength = 0; } AnnotPath::AnnotPath(Array *array) { - coords = NULL; coordsLength = 0; parsePathArray(array); } -AnnotPath::AnnotPath(AnnotCoord **coords, int coordsLength) { - this->coords = coords; +AnnotPath::AnnotPath(std::unique_ptr<AnnotCoord[]> &&coords, int coordsLength) { + this->coords = std::move(coords); this->coordsLength = coordsLength; } -AnnotPath::~AnnotPath() { - if (coords) { - for (int i = 0; i < coordsLength; ++i) - delete coords[i]; - gfree(coords); - } -} - double AnnotPath::getX(int coord) const { if (coord >= 0 && coord < coordsLength) - return coords[coord]->getX(); + return coords[coord].getX(); return 0; } double AnnotPath::getY(int coord) const { if (coord >= 0 && coord < coordsLength) - return coords[coord]->getY(); + return coords[coord].getY(); return 0; } AnnotCoord *AnnotPath::getCoord(int coord) const { if (coord >= 0 && coord < coordsLength) - return coords[coord]; + return &coords[coord]; return NULL; } void AnnotPath::parsePathArray(Array *array) { int tempLength; - AnnotCoord **tempCoords; - GBool correct = gTrue; if (array->getLength() % 2) { error(errSyntaxError, -1, "Bad Annot Path"); @@ -335,36 +323,28 @@ } tempLength = array->getLength() / 2; - tempCoords = (AnnotCoord **) gmallocn (tempLength, sizeof(AnnotCoord *)); - memset(tempCoords, 0, tempLength * sizeof(AnnotCoord *)); - for (int i = 0; i < tempLength && correct; i++) { + auto tempCoords = std::make_unique<AnnotCoord[]>(tempLength); + for (int i = 0; i < tempLength; i++) { double x = 0, y = 0; Object obj1 = array->get(i * 2); if (obj1.isNum()) { x = obj1.getNum(); } else { - correct = gFalse; + return; } obj1 = array->get((i * 2) + 1); if (obj1.isNum()) { y = obj1.getNum(); } else { - correct = gFalse; - } - - if (!correct) { - for (int j = i - 1; j >= 0; j--) - delete tempCoords[j]; - gfree (tempCoords); return; } - tempCoords[i] = new AnnotCoord(x, y); + tempCoords[i] = { x, y }; } - coords = tempCoords; + coords = std::move(tempCoords); coordsLength = tempLength; } @@ -391,114 +371,90 @@ AnnotQuadrilaterals::AnnotQuadrilaterals(Array *array, PDFRectangle *rect) { int arrayLength = array->getLength(); - GBool correct = gTrue; int quadsLength = 0; - AnnotQuadrilateral **quads; double quadArray[8]; // default values - quadrilaterals = NULL; quadrilateralsLength = 0; if ((arrayLength % 8) == 0) { int i; quadsLength = arrayLength / 8; - quads = (AnnotQuadrilateral **) gmallocn - ((quadsLength), sizeof(AnnotQuadrilateral *)); - memset(quads, 0, quadsLength * sizeof(AnnotQuadrilateral *)); - + auto quads = std::make_unique<AnnotQuadrilateral[]>(quadsLength); for (i = 0; i < quadsLength; i++) { for (int j = 0; j < 8; j++) { Object obj = array->get(i * 8 + j); if (obj.isNum()) { quadArray[j] = obj.getNum(); } else { - correct = gFalse; error (errSyntaxError, -1, "Invalid QuadPoint in annot"); - break; + return; } } - if (!correct) - break; - - quads[i] = new AnnotQuadrilateral(quadArray[0], quadArray[1], - quadArray[2], quadArray[3], - quadArray[4], quadArray[5], - quadArray[6], quadArray[7]); + quads[i] = AnnotQuadrilateral(quadArray[0], quadArray[1], + quadArray[2], quadArray[3], + quadArray[4], quadArray[5], + quadArray[6], quadArray[7]); } - if (correct) { - quadrilateralsLength = quadsLength; - quadrilaterals = quads; - } else { - for (int j = 0; j < i; j++) - delete quads[j]; - gfree (quads); - } + + quadrilateralsLength = quadsLength; + quadrilaterals = std::move(quads); } } -AnnotQuadrilaterals::AnnotQuadrilaterals(AnnotQuadrilaterals::AnnotQuadrilateral **quads, int quadsLength) { - quadrilaterals = quads; +AnnotQuadrilaterals::AnnotQuadrilaterals(std::unique_ptr<AnnotQuadrilateral[]> &&quads, int quadsLength) { + quadrilaterals = std::move(quads); quadrilateralsLength = quadsLength; } -AnnotQuadrilaterals::~AnnotQuadrilaterals() { - if (quadrilaterals) { - for(int i = 0; i < quadrilateralsLength; i++) - delete quadrilaterals[i]; - - gfree (quadrilaterals); - } -} - double AnnotQuadrilaterals::getX1(int quadrilateral) { if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) - return quadrilaterals[quadrilateral]->coord1.getX(); + return quadrilaterals[quadrilateral].coord1.getX(); return 0; } double AnnotQuadrilaterals::getY1(int quadrilateral) { if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) - return quadrilaterals[quadrilateral]->coord1.getY(); + return quadrilaterals[quadrilateral].coord1.getY(); return 0; } double AnnotQuadrilaterals::getX2(int quadrilateral) { if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) - return quadrilaterals[quadrilateral]->coord2.getX(); + return quadrilaterals[quadrilateral].coord2.getX(); return 0; } double AnnotQuadrilaterals::getY2(int quadrilateral) { if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) - return quadrilaterals[quadrilateral]->coord2.getY(); + return quadrilaterals[quadrilateral].coord2.getY(); return 0; } double AnnotQuadrilaterals::getX3(int quadrilateral) { if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) - return quadrilaterals[quadrilateral]->coord3.getX(); + return quadrilaterals[quadrilateral].coord3.getX(); return 0; } double AnnotQuadrilaterals::getY3(int quadrilateral) { if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) - return quadrilaterals[quadrilateral]->coord3.getY(); + return quadrilaterals[quadrilateral].coord3.getY(); return 0; } double AnnotQuadrilaterals::getX4(int quadrilateral) { if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) - return quadrilaterals[quadrilateral]->coord4.getX(); + return quadrilaterals[quadrilateral].coord4.getX(); return 0; } double AnnotQuadrilaterals::getY4(int quadrilateral) { if (quadrilateral >= 0 && quadrilateral < quadrilateralsLength) - return quadrilaterals[quadrilateral]->coord4.getY(); + return quadrilaterals[quadrilateral].coord4.getY(); return 0; } @@ -890,12 +846,11 @@ return res; } -GooString * AnnotAppearance::getStateKey(int i) { - GooString * res = NULL; +std::unique_ptr<GooString> AnnotAppearance::getStateKey(int i) { Object obj1 = appearDict.dictLookupNF("N"); if (obj1.isDict()) - res = new GooString(obj1.dictGetKey(i)); - return res; + return std::make_unique<GooString>(obj1.dictGetKey(i)); + return nullptr; } int AnnotAppearance::getNumStates() { @@ -1015,52 +970,36 @@ if (obj1.isArray()) { Array *colorComponents = obj1.getArray(); if (colorComponents->getLength() > 0) { - borderColor = new AnnotColor(colorComponents); - } else { - borderColor = NULL; + borderColor = std::make_unique<AnnotColor>(colorComponents); } - } else { - borderColor = NULL; } obj1 = dict->lookup("BG"); if (obj1.isArray()) { Array *colorComponents = obj1.getArray(); if (colorComponents->getLength() > 0) { - backColor = new AnnotColor(colorComponents); - } else { - backColor = NULL; + backColor = std::make_unique<AnnotColor>(colorComponents); } - } else { - backColor = NULL; } obj1 = dict->lookup("CA"); if (obj1.isString()) { - normalCaption = new GooString(obj1.getString()); - } else { - normalCaption = NULL; + normalCaption = std::make_unique<GooString>(obj1.getString()); } obj1 = dict->lookup("RC"); if (obj1.isString()) { - rolloverCaption = new GooString(obj1.getString()); - } else { - rolloverCaption = NULL; + rolloverCaption = std::make_unique<GooString>(obj1.getString()); } obj1 = dict->lookup("AC"); if (obj1.isString()) { - alternateCaption = new GooString(obj1.getString()); - } else { - alternateCaption = NULL; + alternateCaption = std::make_unique<GooString>(obj1.getString()); } obj1 = dict->lookup("IF"); if (obj1.isDict()) { - iconFit = new AnnotIconFit(obj1.getDict()); - } else { - iconFit = NULL; + iconFit = std::make_unique<AnnotIconFit>(obj1.getDict()); } obj1 = dict->lookup("TP"); @@ -1071,26 +1010,6 @@ } } -AnnotAppearanceCharacs::~AnnotAppearanceCharacs() { - if (borderColor) - delete borderColor; - - if (backColor) - delete backColor; - - if (normalCaption) - delete normalCaption; - - if (rolloverCaption) - delete rolloverCaption; - - if (alternateCaption) - delete alternateCaption; - - if (iconFit) - delete iconFit; -} - //------------------------------------------------------------------------ // AnnotAppearanceBBox //------------------------------------------------------------------------ @@ -1197,16 +1116,12 @@ ok = gTrue; doc = docA; xref = doc->getXRef(); - appearStreams = NULL; - appearBBox = NULL; - appearState = NULL; - appearBuf = NULL; fontSize = 0; appearance.setToNull(); //----- parse the rectangle - rect = new PDFRectangle(); + rect = std::make_unique<PDFRectangle>(); obj1 = dict->lookup("Rect"); if (obj1.isArray() && obj1.arrayGetLength() == 4) { Object obj2; @@ -1235,9 +1150,9 @@ obj1 = dict->lookup("Contents"); if (obj1.isString()) { - contents = obj1.getString()->copy(); + contents.reset(obj1.getString()->copy()); } else { - contents = new GooString(); + contents = std::make_unique<GooString>(); } // Note: This value is overwritten by Annots ctor @@ -1252,16 +1167,12 @@ obj1 = dict->lookup("NM"); if (obj1.isString()) { - name = obj1.getString()->copy(); - } else { - name = NULL; + name.reset(obj1.getString()->copy()); } obj1 = dict->lookup("M"); if (obj1.isString()) { - modified = obj1.getString()->copy(); - } else { - modified = NULL; + modified.reset(obj1.getString()->copy()); } //----- get the flags @@ -1275,13 +1186,13 @@ //----- get the annotation appearance dictionary apObj = dict->lookup("AP"); if (apObj.isDict()) { - appearStreams = new AnnotAppearance(doc, &apObj); + appearStreams = std::make_unique<AnnotAppearance>(doc, &apObj); } //----- get the appearance state asObj = dict->lookup("AS"); if (asObj.isName()) { - appearState = new GooString(asObj.getName()); + appearState = std::make_unique<GooString>(asObj.getName()); } else if (appearStreams && appearStreams->getNumStates() != 0) { error (errSyntaxError, -1, "Invalid or missing AS value in annotation containing one or more appearance subdictionaries"); // AS value is required in this case, but if the @@ -1292,7 +1203,7 @@ } } if (!appearState) { - appearState = new GooString("Off"); + appearState = std::make_unique<GooString>("Off"); } //----- get the annotation appearance @@ -1306,16 +1217,13 @@ // seems to ignore the Border entry for annots that can't have a BS entry. So, we only // follow this rule for annots tha can have a BS entry. obj1 = dict->lookup("Border"); - if (obj1.isArray()) - border = new AnnotBorderArray(obj1.getArray()); - else - border = NULL; + if (obj1.isArray()) { + border = std::make_unique<AnnotBorderArray>(obj1.getArray()); + } obj1 = dict->lookup("C"); if (obj1.isArray()) { - color = new AnnotColor(obj1.getArray()); - } else { - color = NULL; + color = std::make_unique<AnnotColor>(obj1.getArray()); } obj1 = dict->lookup("StructParent"); @@ -1378,8 +1286,7 @@ annotLocker(); /* Set M to current time, unless we are updating M itself */ if (strcmp(key, "M") != 0) { - delete modified; - modified = timeToDateString(NULL); + modified.reset(timeToDateString(nullptr)); annotObj.dictSet("M", Object(modified->copy())); } @@ -1391,17 +1298,16 @@ void Annot::setContents(GooString *new_content) { annotLocker(); - delete contents; if (new_content) { - contents = new GooString(new_content); + contents = std::make_unique<GooString>(new_content); //append the unicode marker <FE FF> if needed if (!contents->hasUnicodeMarker()) { contents->insert(0, 0xff); contents->insert(0, 0xfe); } } else { - contents = new GooString(); + contents = std::make_unique<GooString>(); } update ("Contents", Object(contents->copy())); @@ -1409,12 +1315,11 @@ void Annot::setName(GooString *new_name) { annotLocker(); - delete name; if (new_name) { - name = new GooString(new_name); + name = std::make_unique<GooString>(new_name); } else { - name = new GooString(); + name = std::make_unique<GooString>(); } update ("NM", Object(name->copy())); @@ -1422,12 +1327,11 @@ void Annot::setModified(GooString *new_modified) { annotLocker(); - delete modified; if (new_modified) - modified = new GooString(new_modified); + modified = std::make_unique<GooString>(new_modified); else - modified = new GooString(); + modified = std::make_unique<GooString>(); update ("M", Object(modified->copy())); } @@ -1438,30 +1342,28 @@ update ("F", Object(int(flags))); } -void Annot::setBorder(AnnotBorder *new_border) { +void Annot::setBorder(std::unique_ptr<AnnotBorder> &&new_border) { annotLocker(); - delete border; if (new_border) { Object obj1 = new_border->writeToObject(xref); update(new_border->getType() == AnnotBorder::typeArray ? "Border" : "BS", std::move(obj1)); - border = new_border; + border = std::move(new_border); } else { - border = NULL; + border = nullptr; } invalidateAppearance(); } -void Annot::setColor(AnnotColor *new_color) { +void Annot::setColor(std::unique_ptr<AnnotColor> &&new_color) { annotLocker(); - delete color; if (new_color) { Object obj1 = new_color->writeToObject(xref); update ("C", std::move(obj1)); - color = new_color; + color = std::move(new_color); } else { - color = NULL; + color = nullptr; } invalidateAppearance(); } @@ -1489,11 +1391,8 @@ if (!state) return; - delete appearState; - appearState = new GooString(state); - - delete appearBBox; - appearBBox = NULL; + appearState = std::make_unique<GooString>(state); + appearBBox = nullptr; update ("AS", Object(objName, state)); @@ -1510,15 +1409,9 @@ if (appearStreams) { // Remove existing appearance streams appearStreams->removeAllStreams(); } - delete appearStreams; - appearStreams = NULL; - - delete appearState; - appearState = NULL; - - delete appearBBox; - appearBBox = NULL; - + appearStreams = nullptr; + appearState = nullptr; + appearBBox = nullptr; appearance.setToNull(); Object obj2 = annotObj.dictLookup("AP"); @@ -1583,27 +1476,6 @@ } Annot::~Annot() { - delete rect; - delete contents; - - if (name) - delete name; - - if (modified) - delete modified; - - delete appearStreams; - delete appearBBox; - - if (appearState) - delete appearState; - - if (border) - delete border; - - if (color) - delete color; - #if MULTITHREADED gDestroyMutex(&mutex); #endif @@ -1827,7 +1699,7 @@ // draw the appearance stream Object obj = appearance.fetch(gfx->getXRef()); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); } @@ -1895,36 +1767,18 @@ initialize(docA, dictObject->getDict(), obj); } -AnnotMarkup::~AnnotMarkup() { - if (label) - delete label; - - if (popup) - delete popup; - - if (date) - delete date; - - if (subject) - delete subject; -} - void AnnotMarkup::initialize(PDFDoc *docA, Dict *dict, Object *obj) { Object obj1, obj2; obj1 = dict->lookup("T"); if (obj1.isString()) { - label = obj1.getString()->copy(); - } else { - label = NULL; + label.reset(obj1.getString()->copy()); } obj1 = dict->lookup("Popup"); obj2 = dict->lookupNF("Popup"); if (obj1.isDict() && obj2.isRef()) { - popup = new AnnotPopup(docA, &obj1, &obj2); - } else { - popup = NULL; + popup = std::make_unique<AnnotPopup>(docA, &obj1, &obj2); } obj1 = dict->lookup("CA"); @@ -1936,9 +1790,7 @@ obj1 = dict->lookup("CreationDate"); if (obj1.isString()) { - date = obj1.getString()->copy(); - } else { - date = NULL; + date.reset(obj1.getString()->copy()); } obj1 = dict->lookupNF("IRT"); @@ -1951,9 +1803,7 @@ obj1 = dict->lookup("Subj"); if (obj1.isString()) { - subject = obj1.getString()->copy(); - } else { - subject = NULL; + subject.reset(obj1.getString()->copy()); } obj1 = dict->lookup("RT"); @@ -1980,41 +1830,38 @@ } void AnnotMarkup::setLabel(GooString *new_label) { - delete label; - if (new_label) { - label = new GooString(new_label); + label = std::make_unique<GooString>(new_label); //append the unicode marker <FE FF> if needed if (!label->hasUnicodeMarker()) { label->insert(0, 0xff); label->insert(0, 0xfe); } } else { - label = new GooString(); + label = std::make_unique<GooString>(); } update ("T", Object(label->copy())); } -void AnnotMarkup::setPopup(AnnotPopup *new_popup) { +void AnnotMarkup::setPopup(std::unique_ptr<AnnotPopup> &&new_popup) { // If there exists an old popup annotation that is already // associated with a page, then we need to remove that // popup annotation from the page. Otherwise we would have // dangling references to it. - if (popup != NULL && popup->getPageNum() != 0) { + if (popup && popup->getPageNum() != 0) { Page *pageobj = doc->getPage(popup->getPageNum()); if (pageobj) { - pageobj->removeAnnot(popup); + pageobj->removeAnnot(popup.get()); } } - delete popup; if (new_popup) { const Ref popupRef = new_popup->getRef(); update ("Popup", Object(popupRef.num, popupRef.gen)); new_popup->setParent(this); - popup = new_popup; + popup = std::move(new_popup); // If this annotation is already added to a page, then we // add the new popup annotation to the same page. @@ -2022,10 +1869,10 @@ Page *pageobj = doc->getPage(page); assert(pageobj != NULL); // pageobj should exist in doc (see setPage()) - pageobj->addAnnot(popup); + pageobj->addAnnot(popup.get()); } } else { - popup = NULL; + popup = nullptr; } } @@ -2036,12 +1883,10 @@ } void AnnotMarkup::setDate(GooString *new_date) { - delete date; - if (new_date) - date = new GooString(new_date); + date = std::make_unique<GooString>(new_date); else - date = new GooString(); + date = std::make_unique<GooString>(); update ("CreationDate", Object(date->copy())); } @@ -2052,7 +1897,7 @@ // Remove popup if (popup) { - pageobj->removeAnnot(popup); + pageobj->removeAnnot(popup.get()); } Annot::removeReferencedObjects(); @@ -2079,10 +1924,6 @@ initialize (docA, dictObject->getDict()); } -AnnotText::~AnnotText() { - delete icon; -} - void AnnotText::initialize(PDFDoc *docA, Dict *dict) { Object obj1; @@ -2094,9 +1935,9 @@ obj1 = dict->lookup("Name"); if (obj1.isName()) { - icon = new GooString(obj1.getName()); + icon = std::make_unique<GooString>(obj1.getName()); } else { - icon = new GooString("Note"); + icon = std::make_unique<GooString>("Note"); } obj1 = dict->lookup("StateModel"); @@ -2174,12 +2015,10 @@ if (new_icon && icon->cmp(new_icon) == 0) return; - delete icon; - if (new_icon) { - icon = new GooString (new_icon); + icon = std::make_unique<GooString>(new_icon); } else { - icon = new GooString("Note"); + icon = std::make_unique<GooString>("Note"); } update("Name", Object(objName, icon->getCString())); @@ -2440,11 +2279,11 @@ if (appearance.isNull()) { ca = opacity; - appearBuf = new GooString (); + appearBuf = std::make_unique<GooString>(); appearBuf->append ("q\n"); if (color) - setColor(color, gTrue); + setColor(color.get(), gTrue); else appearBuf->append ("1 1 1 rg\n"); if (!icon->cmp("Note")) @@ -2469,31 +2308,29 @@ // Force 24x24 rectangle PDFRectangle fixedRect(rect->x1, rect->y2 - 24, rect->x1 + 24, rect->y2); - appearBBox = new AnnotAppearanceBBox(&fixedRect); + appearBBox = std::make_unique<AnnotAppearanceBBox>(&fixedRect); double bbox[4]; appearBBox->getBBoxRect(bbox); if (ca == 1) { appearance = createForm(bbox, gFalse, nullptr); } else { Object aStream = createForm(bbox, gTrue, nullptr); - delete appearBuf; - - appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do"); Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL); appearance = createForm(bbox, gFalse, resDict); } - delete appearBuf; + appearBuf = nullptr; } // draw the appearance stream Object obj = appearance.fetch(gfx->getXRef()); if (appearBBox) { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), appearBBox->getPageXMin(), appearBBox->getPageYMin(), appearBBox->getPageXMax(), appearBBox->getPageYMax(), getRotation()); } else { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); } } @@ -2517,30 +2354,18 @@ initialize (docA, dictObject->getDict()); } -AnnotLink::~AnnotLink() { - delete action; - /* - if (uriAction) - delete uriAction; - */ - if (quadrilaterals) - delete quadrilaterals; -} - void AnnotLink::initialize(PDFDoc *docA, Dict *dict) { Object obj1; - action = NULL; - // look for destination obj1 = dict->lookup("Dest"); if (!obj1.isNull()) { - action = LinkAction::parseDest(&obj1); + action.reset(LinkAction::parseDest(&obj1)); // look for action } else { obj1 = dict->lookup("A"); if (obj1.isDict()) { - action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI()); + action.reset(LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI())); } } @@ -2573,17 +2398,14 @@ */ obj1 = dict->lookup("QuadPoints"); if (obj1.isArray()) { - quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect); - } else { - quadrilaterals = NULL; + quadrilaterals = std::make_unique<AnnotQuadrilaterals>(obj1.getArray(), rect.get()); } obj1 = dict->lookup("BS"); if (obj1.isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); + border = std::make_unique<AnnotBorderBS>(obj1.getDict()); } else if (!border) { - border = new AnnotBorderBS(); + border = std::make_unique<AnnotBorderBS>(); } } @@ -2594,7 +2416,7 @@ annotLocker(); // draw the appearance stream Object obj = appearance.fetch(gfx->getXRef()); - gfx->drawAnnot(&obj, border, color, + gfx->drawAnnot(&obj, border.get(), color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); } @@ -2619,30 +2441,14 @@ initialize(docA, dictObject->getDict()); } -AnnotFreeText::~AnnotFreeText() { - delete appearanceString; - - if (styleString) - delete styleString; - - if (calloutLine) - delete calloutLine; - - if (borderEffect) - delete borderEffect; - - if (rectangle) - delete rectangle; -} - void AnnotFreeText::initialize(PDFDoc *docA, Dict *dict) { Object obj1; obj1 = dict->lookup("DA"); if (obj1.isString()) { - appearanceString = obj1.getString()->copy(); + appearanceString.reset(obj1.getString()->copy()); } else { - appearanceString = new GooString(); + appearanceString = std::make_unique<GooString>(); error(errSyntaxError, -1, "Bad appearance for annotation"); ok = gFalse; } @@ -2656,9 +2462,7 @@ obj1 = dict->lookup("DS"); if (obj1.isString()) { - styleString = obj1.getString()->copy(); - } else { - styleString = NULL; + styleString.reset(obj1.getString()->copy()); } obj1 = dict->lookup("CL"); @@ -2675,12 +2479,10 @@ double x3, y3; (obj2 = obj1.arrayGet(4), obj2.isNum() ? x3 = obj2.getNum() : x3 = 0); (obj2 = obj1.arrayGet(5), obj2.isNum() ? y3 = obj2.getNum() : y3 = 0); - calloutLine = new AnnotCalloutMultiLine(x1, y1, x2, y2, x3, y3); + calloutLine = std::make_unique<AnnotCalloutMultiLine>(x1, y1, x2, y2, x3, y3); } else { - calloutLine = new AnnotCalloutLine(x1, y1, x2, y2); + calloutLine = std::make_unique<AnnotCalloutLine>(x1, y1, x2, y2); } - } else { - calloutLine = NULL; } obj1 = dict->lookup("IT"); @@ -2702,24 +2504,19 @@ obj1 = dict->lookup("BS"); if (obj1.isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); + border = std::make_unique<AnnotBorderBS>(obj1.getDict()); } else if (!border) { - border = new AnnotBorderBS(); + border = std::make_unique<AnnotBorderBS>(); } obj1 = dict->lookup("BE"); if (obj1.isDict()) { - borderEffect = new AnnotBorderEffect(obj1.getDict()); - } else { - borderEffect = NULL; + borderEffect = std::make_unique<AnnotBorderEffect>(obj1.getDict()); } obj1 = dict->lookup("RD"); if (obj1.isArray()) { - rectangle = parseDiffRectangle(obj1.getArray(), rect); - } else { - rectangle = NULL; + rectangle = parseDiffRectangle(obj1.getArray(), rect.get()); } obj1 = dict->lookup("LE"); @@ -2737,12 +2534,10 @@ } void AnnotFreeText::setAppearanceString(GooString *new_string) { - delete appearanceString; - if (new_string) { - appearanceString = new GooString(new_string); + appearanceString = std::make_unique<GooString>(new_string); } else { - appearanceString = new GooString(); + appearanceString = std::make_unique<GooString>(); } update ("DA", Object(appearanceString->copy())); @@ -2757,29 +2552,25 @@ } void AnnotFreeText::setStyleString(GooString *new_string) { - delete styleString; - if (new_string) { - styleString = new GooString(new_string); + styleString = std::make_unique<GooString>(new_string); //append the unicode marker <FE FF> if needed if (!styleString->hasUnicodeMarker()) { styleString->insert(0, 0xff); styleString->insert(0, 0xfe); } } else { - styleString = new GooString(); + styleString = std::make_unique<GooString>(); } update ("DS", Object(styleString->copy())); } void AnnotFreeText::setCalloutLine(AnnotCalloutLine *line) { - delete calloutLine; - Object obj1; if (line == NULL) { obj1.setToNull(); - calloutLine = NULL; + calloutLine = nullptr; } else { double x1 = line->getX1(), y1 = line->getY1(); double x2 = line->getX2(), y2 = line->getY2(); @@ -2794,9 +2585,9 @@ double x3 = mline->getX3(), y3 = mline->getY3(); obj1.arrayAdd( Object(x3) ); obj1.arrayAdd( Object(y3) ); - calloutLine = new AnnotCalloutMultiLine(x1, y1, x2, y2, x3, y3); + calloutLine = std::make_unique<AnnotCalloutMultiLine>(x1, y1, x2, y2, x3, y3); } else { - calloutLine = new AnnotCalloutLine(x1, y1, x2, y2); + calloutLine = std::make_unique<AnnotCalloutLine>(x1, y1, x2, y2); } } @@ -2834,9 +2625,9 @@ return GfxFont::makeFont(xref, "AnnotDrawFont", dummyRef, fontDict); } -void AnnotFreeText::parseAppearanceString(GooString *da, double &fontsize, AnnotColor* &fontcolor) { +void AnnotFreeText::parseAppearanceString(GooString *da, double &fontsize, std::unique_ptr<AnnotColor> &fontcolor) { fontsize = -1; - fontcolor = NULL; + if (da) { GooList * daToks = new GooList(); int j, i = 0; @@ -2862,18 +2653,18 @@ fontsize = gatof(( (GooString *)daToks->get(i-1) )->getCString()); } } - if (fontcolor == NULL) { + if (!fontcolor) { if (!((GooString *)daToks->get(i))->cmp("g") && i >= 1) { - fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-1) )->getCString())); + fontcolor = std::make_unique<AnnotColor>(gatof(( (GooString *)daToks->get(i-1) )->getCString())); } else if (!((GooString *)daToks->get(i))->cmp("rg") && i >= 3) { - fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-3) )->getCString()), - gatof(( (GooString *)daToks->get(i-2) )->getCString()), - gatof(( (GooString *)daToks->get(i-1) )->getCString())); + fontcolor = std::make_unique<AnnotColor>(gatof(( (GooString *)daToks->get(i-3) )->getCString()), + gatof(( (GooString *)daToks->get(i-2) )->getCString()), + gatof(( (GooString *)daToks->get(i-1) )->getCString())); } else if (!((GooString *)daToks->get(i))->cmp("k") && i >= 4) { - fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-4) )->getCString()), - gatof(( (GooString *)daToks->get(i-3) )->getCString()), - gatof(( (GooString *)daToks->get(i-2) )->getCString()), - gatof(( (GooString *)daToks->get(i-1) )->getCString())); + fontcolor = std::make_unique<AnnotColor>(gatof(( (GooString *)daToks->get(i-4) )->getCString()), + gatof(( (GooString *)daToks->get(i-3) )->getCString()), + gatof(( (GooString *)daToks->get(i-2) )->getCString()), + gatof(( (GooString *)daToks->get(i-1) )->getCString())); } } } @@ -2885,12 +2676,12 @@ { double borderWidth, ca = opacity; - appearBuf = new GooString (); + appearBuf = std::make_unique<GooString>(); appearBuf->append ("q\n"); borderWidth = border->getWidth(); if (borderWidth > 0) - setLineStyleForBorder(border); + setLineStyleForBorder(border.get()); // Box size const double width = rect->x2 - rect->x1; @@ -2898,26 +2689,26 @@ // Parse some properties from the appearance string double fontsize; - AnnotColor *fontcolor; - parseAppearanceString(appearanceString, fontsize, fontcolor); + std::unique_ptr<AnnotColor> fontcolor; + parseAppearanceString(appearanceString.get(), fontsize, fontcolor); // Default values if (fontsize <= 0) fontsize = 10; - if (fontcolor == NULL) - fontcolor = new AnnotColor(0, 0, 0); // Black + if (!fontcolor) + fontcolor = std::make_unique<AnnotColor>(0, 0, 0); // Black if (!contents) - contents = new GooString (); + contents = std::make_unique<GooString>(); // Draw box GBool doFill = (color && color->getSpace() != AnnotColor::colorTransparent); GBool doStroke = (borderWidth != 0); if (doFill || doStroke) { if (doStroke) { - setColor(fontcolor, gFalse); // Border color: same as font color + setColor(fontcolor.get(), gFalse); // Border color: same as font color } appearBuf->appendf ("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re\n", borderWidth/2, width-borderWidth, height-borderWidth); if (doFill) { - setColor(color, gTrue); + setColor(color.get(), gTrue); appearBuf->append(doStroke ? "B\n" : "f\n"); } else { appearBuf->append("S\n"); @@ -2933,7 +2724,7 @@ GfxFont *font = createAnnotDrawFont(xref, fontResDict); // Set font state - setColor(fontcolor, gTrue); + setColor(fontcolor.get(), gTrue); appearBuf->appendf ("BT 1 0 0 1 {0:.2f} {1:.2f} Tm\n", textmargin, height - textmargin - fontsize * font->getDescent()); appearBuf->appendf ("/AnnotDrawFont {0:.2f} Tf\n", fontsize); @@ -2942,7 +2733,7 @@ while (i < contents->getLength()) { GooString out; double linewidth, xpos; - layoutText(contents, &out, &i, font, &linewidth, textwidth/fontsize, NULL, gFalse); + layoutText(contents.get(), &out, &i, font, &linewidth, textwidth/fontsize, NULL, gFalse); linewidth *= fontsize; switch (quadding) { case quaddingCentered: @@ -2956,13 +2747,13 @@ break; } appearBuf->appendf("{0:.2f} {1:.2f} Td\n", xpos - xposPrev, -fontsize); - writeString(&out, appearBuf); + writeString(&out, appearBuf.get()); appearBuf->append("Tj\n"); xposPrev = xpos; } font->decRefCnt(); - delete fontcolor; + fontcolor = nullptr; appearBuf->append ("ET Q\n"); double bbox[4]; @@ -2974,13 +2765,11 @@ appearance = createForm(bbox, gFalse, fontResDict); } else { Object aStream = createForm(bbox, gTrue, fontResDict); - delete appearBuf; - - appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do"); Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL); appearance = createForm(bbox, gFalse, resDict); } - delete appearBuf; + appearBuf = nullptr; } void AnnotFreeText::draw(Gfx *gfx, GBool printing) { @@ -2994,7 +2783,7 @@ // draw the appearance stream Object obj = appearance.fetch(gfx->getXRef()); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); } @@ -3027,17 +2816,6 @@ initialize(docA, dictObject->getDict()); } -AnnotLine::~AnnotLine() { - delete coord1; - delete coord2; - - if (interiorColor) - delete interiorColor; - - if (measure) - delete measure; -} - void AnnotLine::initialize(PDFDoc *docA, Dict *dict) { Object obj1; @@ -3051,11 +2829,11 @@ (obj2 = obj1.arrayGet(2), obj2.isNum() ? x2 = obj2.getNum() : x2 = 0); (obj2 = obj1.arrayGet(3), obj2.isNum() ? y2 = obj2.getNum() : y2 = 0); - coord1 = new AnnotCoord(x1, y1); - coord2 = new AnnotCoord(x2, y2); + coord1 = std::make_unique<AnnotCoord>(x1, y1); + coord2 = std::make_unique<AnnotCoord>(x2, y2); } else { - coord1 = new AnnotCoord(); - coord2 = new AnnotCoord(); + coord1 = std::make_unique<AnnotCoord>(); + coord2 = std::make_unique<AnnotCoord>(); } obj1 = dict->lookup("LE"); @@ -3080,9 +2858,7 @@ obj1 = dict->lookup("IC"); if (obj1.isArray()) { - interiorColor = new AnnotColor(obj1.getArray()); - } else { - interiorColor = NULL; + interiorColor = std::make_unique<AnnotColor>(obj1.getArray()); } obj1 = dict->lookup("LL"); @@ -3170,10 +2946,9 @@ obj1 = dict->lookup("BS"); if (obj1.isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); + border = std::make_unique<AnnotBorderBS>(obj1.getDict()); } else if (!border) { - border = new AnnotBorderBS(); + border = std::make_unique<AnnotBorderBS>(); } } @@ -3184,10 +2959,8 @@ } void AnnotLine::setVertices(double x1, double y1, double x2, double y2) { - delete coord1; - coord1 = new AnnotCoord(x1, y1); - delete coord2; - coord2 = new AnnotCoord(x2, y2); + coord1 = std::make_unique<AnnotCoord>(x1, y1); + coord2 = std::make_unique<AnnotCoord>(x2, y2); Array *lArray = new Array(xref); lArray->add( Object(x1) ); @@ -3211,15 +2984,13 @@ invalidateAppearance(); } -void AnnotLine::setInteriorColor(AnnotColor *new_color) { - delete interiorColor; - +void AnnotLine::setInteriorColor(std::unique_ptr<AnnotColor> &&new_color) { if (new_color) { Object obj1 = new_color->writeToObject(xref); update ("IC", std::move(obj1)); - interiorColor = new_color; + interiorColor = std::move(new_color); } else { - interiorColor = NULL; + interiorColor = nullptr; } invalidateAppearance(); } @@ -3260,14 +3031,14 @@ { double borderWidth, ca = opacity; - appearBBox = new AnnotAppearanceBBox(rect); - appearBuf = new GooString (); + appearBBox = std::make_unique<AnnotAppearanceBBox>(rect.get()); + appearBuf = std::make_unique<GooString>(); appearBuf->append ("q\n"); if (color) { - setColor(color, gFalse); + setColor(color.get(), gFalse); } - setLineStyleForBorder(border); + setLineStyleForBorder(border.get()); borderWidth = border->getWidth(); appearBBox->setBorderWidth(std::max(1., borderWidth)); @@ -3306,7 +3077,7 @@ while (i < contents->getLength()) { GooString out; double linewidth; - layoutText(contents, &out, &i, font, &linewidth, 0, NULL, gFalse); + layoutText(contents.get(), &out, &i, font, &linewidth, 0, NULL, gFalse); linewidth *= fontsize; if (linewidth > captionwidth) { captionwidth = linewidth; @@ -3375,11 +3146,11 @@ while (i < contents->getLength()) { GooString out; double linewidth, xpos; - layoutText(contents, &out, &i, font, &linewidth, 0, NULL, gFalse); + layoutText(contents.get(), &out, &i, font, &linewidth, 0, NULL, gFalse); linewidth *= fontsize; xpos = (captionwidth - linewidth) / 2; appearBuf->appendf("{0:.2f} {1:.2f} Td\n", xpos - xposPrev, -fontsize); - writeString(&out, appearBuf); + writeString(&out, appearBuf.get()); appearBuf->append ("Tj\n"); xposPrev = xpos; } @@ -3414,13 +3185,11 @@ appearance = createForm(bbox, gFalse, fontResDict); } else { Object aStream = createForm(bbox, gTrue, fontResDict); - delete appearBuf; - - appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do"); Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL); appearance = createForm(bbox, gFalse, resDict); } - delete appearBuf; + appearBuf = nullptr; } void AnnotLine::draw(Gfx *gfx, GBool printing) { @@ -3435,12 +3204,12 @@ // draw the appearance stream Object obj = appearance.fetch(gfx->getXRef()); if (appearBBox) { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), appearBBox->getPageXMin(), appearBBox->getPageYMin(), appearBBox->getPageXMax(), appearBBox->getPageYMax(), getRotation()); } else { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); } } @@ -3514,18 +3283,13 @@ obj1 = dict->lookup("QuadPoints"); if (obj1.isArray()) { - quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect); + quadrilaterals = std::make_unique<AnnotQuadrilaterals>(obj1.getArray(), rect.get()); } else { error(errSyntaxError, -1, "Bad Annot Text Markup QuadPoints"); - quadrilaterals = NULL; ok = gFalse; } } -AnnotTextMarkup::~AnnotTextMarkup() { - delete quadrilaterals; -} - void AnnotTextMarkup::setType(AnnotSubtype new_type) { const char *typeName; @@ -3565,8 +3329,7 @@ a->add(Object(quadPoints->getY4(i))); } - delete quadrilaterals; - quadrilaterals = new AnnotQuadrilaterals(a, rect); + quadrilaterals = std::make_unique<AnnotQuadrilaterals>(a, rect.get()); annotObj.dictSet ("QuadPoints", Object(a)); invalidateAppearance(); @@ -3584,12 +3347,11 @@ GBool blendMultiply = gTrue; ca = opacity; - appearBuf = new GooString (); + appearBuf = std::make_unique<GooString>(); appearBuf->append ("q\n"); /* Adjust BBox */ - delete appearBBox; - appearBBox = new AnnotAppearanceBBox(rect); + appearBBox = std::make_unique<AnnotAppearanceBBox>(rect.get()); for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) { appearBBox->extendTo (quadrilaterals->getX1(i) - rect->x1, quadrilaterals->getY1(i) - rect->y1); appearBBox->extendTo (quadrilaterals->getX2(i) - rect->x1, quadrilaterals->getY2(i) - rect->y1); @@ -3600,7 +3362,7 @@ switch (type) { case typeUnderline: if (color) { - setColor(color, gFalse); + setColor(color.get(), gFalse); } appearBuf->append ("[] 0 d 1 w\n"); @@ -3619,7 +3381,7 @@ break; case typeStrikeOut: if (color) { - setColor(color, gFalse); + setColor(color.get(), gFalse); } blendMultiply = gFalse; appearBuf->append ("[] 0 d 1 w\n"); @@ -3645,7 +3407,7 @@ break; case typeSquiggly: if (color) { - setColor(color, gFalse); + setColor(color.get(), gFalse); } appearBuf->append ("[] 0 d 1 w\n"); @@ -3672,7 +3434,7 @@ default: case typeHighlight: if (color) - setColor(color, gTrue); + setColor(color.get(), gTrue); double biggestBorder = 0; for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) { @@ -3713,32 +3475,28 @@ bbox[2] = appearBBox->getPageXMax(); bbox[3] = appearBBox->getPageYMax(); aStream = createForm(bbox, gTrue, NULL); - delete appearBuf; - - appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do"); Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", 1, blendMultiply ? "Multiply" : NULL); if (ca == 1) { appearance = createForm(bbox, gFalse, resDict); } else { aStream = createForm(bbox, gTrue, resDict); - delete appearBuf; - - appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do"); Dict *resDict2 = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL); appearance = createForm(bbox, gFalse, resDict2); } - delete appearBuf; + appearBuf = nullptr; } // draw the appearance stream Object obj = appearance.fetch(gfx->getXRef()); if (appearBBox) { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), appearBBox->getPageXMin(), appearBBox->getPageYMin(), appearBBox->getPageXMax(), appearBBox->getPageYMax(), getRotation()); } else { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); } } @@ -3761,17 +3519,6 @@ initialize(docA, dictObject->getDict()); } -AnnotWidget::~AnnotWidget() { - if (appearCharacs) - delete appearCharacs; - - if (action) - delete action; - - if (parent) - delete parent; -} - void AnnotWidget::initialize(PDFDoc *docA, Dict *dict) { Object obj1; @@ -3796,15 +3543,12 @@ obj1 = dict->lookup("MK"); if (obj1.isDict()) { - appearCharacs = new AnnotAppearanceCharacs(obj1.getDict()); - } else { - appearCharacs = NULL; + appearCharacs = std::make_unique<AnnotAppearanceCharacs>(obj1.getDict()); } - action = NULL; obj1 = dict->lookup("A"); if (obj1.isDict()) { - action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI()); + action.reset(LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI())); } additionalActions = dict->lookupNF("AA"); @@ -3818,8 +3562,7 @@ obj1 = dict->lookup("BS"); if (obj1.isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); + border = std::make_unique<AnnotBorderBS>(obj1.getDict()); } updatedAppearanceStream.num = updatedAppearanceStream.gen = -1; @@ -4083,7 +3826,8 @@ GBool txField, GBool forceZapfDingbats, GBool password) { GooList *daToks; - GooString *tok, *convertedText; + GooString *tok; + GooString convertedText; GfxFont *font; double dx, dy; double fontSize, fontSize2, borderWidth, x, xPrev, y, w, wMax; @@ -4188,8 +3932,6 @@ freeText = gTrue; } - convertedText = new GooString; - // setup if (txField) { appearBuf->append("/Tx BMC\n"); @@ -4231,7 +3973,7 @@ y = dy - 3; i = 0; while (i < text->getLength()) { - layoutText(text, convertedText, &i, font, &w, wMax / fontSize, NULL, + layoutText(text, &convertedText, &i, font, &w, wMax / fontSize, NULL, forceZapfDingbats); y -= fontSize; } @@ -4278,7 +4020,7 @@ i = 0; xPrev = 0; while (i < text->getLength()) { - layoutText(text, convertedText, &i, font, &w, wMax / fontSize, NULL, + layoutText(text, &convertedText, &i, font, &w, wMax / fontSize, NULL, forceZapfDingbats); w *= fontSize; @@ -4298,7 +4040,7 @@ // draw the line appearBuf->appendf("{0:.2f} {1:.2f} Td\n", x - xPrev, -fontSize); - writeString(convertedText, appearBuf); + writeString(&convertedText, appearBuf.get()); appearBuf->append(" Tj\n"); // next line @@ -4331,7 +4073,7 @@ } i = 0; - layoutText(text, convertedText, &i, font, NULL, 0.0, &charCount, + layoutText(text, &convertedText, &i, font, NULL, 0.0, &charCount, forceZapfDingbats); if (charCount > comb) charCount = comb; @@ -4374,8 +4116,8 @@ } // write the text string - char *s = convertedText->getCString(); - int len = convertedText->getLength(); + char *s = convertedText.getCString(); + int len = convertedText.getLength(); i = 0; xPrev = w; // so that first character is placed properly while (i < comb && len > 0) { @@ -4394,10 +4136,9 @@ x = 0.5 * (w - dx); appearBuf->appendf("{0:.2f} 0 Td\n", x - xPrev + w); - GooString *charBuf = new GooString(s, n); - writeString(charBuf, appearBuf); + GooString charBuf(s, n); + writeString(&charBuf, appearBuf.get()); appearBuf->append(" Tj\n"); - delete charBuf; i++; s += n; @@ -4408,7 +4149,7 @@ // regular (non-comb) formatting } else { i = 0; - layoutText(text, convertedText, &i, font, &w, 0.0, NULL, + layoutText(text, &convertedText, &i, font, &w, 0.0, NULL, forceZapfDingbats); // compute font autosize @@ -4465,7 +4206,7 @@ } // write the text string - writeString(convertedText, appearBuf); + writeString(&convertedText, appearBuf.get()); appearBuf->append(" Tj\n"); } } @@ -4481,7 +4222,6 @@ if (freeText) { delete text; } - delete convertedText; if (freeFont) { font->decRefCnt(); } @@ -4491,7 +4231,8 @@ void AnnotWidget::drawListBox(FormFieldChoice *fieldChoice, GooString *da, GfxResources *resources, int quadding) { GooList *daToks; - GooString *tok, *convertedText; + GooString *tok; + GooString convertedText; GfxFont *font; double fontSize, fontSize2, borderWidth, x, y, w, wMax; int tfPos, tmPos, i, j; @@ -4552,8 +4293,6 @@ return; } - convertedText = new GooString; - // get the border width borderWidth = border ? border->getWidth() : 0; @@ -4567,10 +4306,9 @@ if (daToks) { deleteGooList(daToks, GooString); } - delete convertedText; return; } - layoutText(fieldChoice->getChoice(i), convertedText, &j, font, &w, 0.0, NULL, gFalse); + layoutText(fieldChoice->getChoice(i), &convertedText, &j, font, &w, 0.0, NULL, gFalse); if (w > wMax) { wMax = w; } @@ -4608,7 +4346,7 @@ // compute text width and start position j = 0; - layoutText(fieldChoice->getChoice(i), convertedText, &j, font, &w, 0.0, NULL, gFalse); + layoutText(fieldChoice->getChoice(i), &convertedText, &j, font, &w, 0.0, NULL, gFalse); w *= fontSize; switch (quadding) { case quaddingLeftJustified: @@ -4651,7 +4389,7 @@ } // write the text string - writeString(convertedText, appearBuf); + writeString(&convertedText, appearBuf.get()); appearBuf->append(" Tj\n"); // cleanup @@ -4665,8 +4403,6 @@ if (daToks) { deleteGooList(daToks, GooString); } - - delete convertedText; } void AnnotWidget::drawBorder() { @@ -4856,7 +4592,7 @@ GfxResources *resources; GooString *da; - appearBuf = new GooString (); + appearBuf = std::make_unique<GooString>(); // draw the background if (appearCharacs) { @@ -4918,7 +4654,7 @@ MemStream *appearStream = new MemStream(copyString(appearBuf->getCString()), 0, appearBuf->getLength(), Object(appearDict)); appearance = Object(static_cast<Stream*>(appearStream)); - delete appearBuf; + appearBuf = nullptr; appearStream->setNeedFree(gTrue); } @@ -4954,7 +4690,7 @@ obj1.dictAdd(copyString("N"), Object(updatedAppearanceStream.num, updatedAppearanceStream.gen)); // Update our internal pointers to the appearance dictionary - appearStreams = new AnnotAppearance(doc, &obj1); + appearStreams = std::make_unique<AnnotAppearance>(doc, &obj1); update("AP", std::move(obj1)); } else { @@ -4995,7 +4731,7 @@ gfx->pushResources(dict); delete dict; } - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); if (addDingbatsResource) { gfx->popResources(); @@ -5013,7 +4749,7 @@ type = typeMovie; annotObj.dictSet ("Subtype", Object(objName, "Movie")); - movie = movieA->copy(); + movie.reset(movieA->copy()); // TODO: create movie dict from movieA initialize(docA, annotObj.getDict()); @@ -5025,37 +4761,27 @@ initialize(docA, dictObject->getDict()); } -AnnotMovie::~AnnotMovie() { - if (title) - delete title; - delete movie; -} - void AnnotMovie::initialize(PDFDoc *docA, Dict* dict) { Object obj1; obj1 = dict->lookup("T"); if (obj1.isString()) { - title = obj1.getString()->copy(); - } else { - title = NULL; + title.reset(obj1.getString()->copy()); } Object movieDict = dict->lookup("Movie"); if (movieDict.isDict()) { Object obj2 = dict->lookup("A"); if (obj2.isDict()) - movie = new Movie (&movieDict, &obj2); + movie = std::make_unique<Movie>(&movieDict, &obj2); else - movie = new Movie (&movieDict); + movie = std::make_unique<Movie>(&movieDict); if (!movie->isOk()) { - delete movie; - movie = NULL; + movie = nullptr; ok = gFalse; } } else { error(errSyntaxError, -1, "Bad Annot Movie"); - movie = NULL; ok = gFalse; } } @@ -5071,7 +4797,7 @@ movie->getAspect(&width, &height); if (width != -1 && height != -1 && !poster.isNone()) { - appearBuf = new GooString (); + appearBuf = std::make_unique<GooString>(); appearBuf->append ("q\n"); appearBuf->appendf ("{0:d} 0 0 {1:d} 0 0 cm\n", width, height); appearBuf->append ("/MImg Do\n"); @@ -5106,7 +4832,6 @@ MemStream *mStream = new MemStream(copyString(appearBuf->getCString()), 0, appearBuf->getLength(), Object(formDict)); mStream->setNeedFree(gTrue); - delete appearBuf; Dict *dict = new Dict(gfx->getXRef()); dict->set("FRM", Object(static_cast<Stream*>(mStream))); @@ -5114,7 +4839,7 @@ Dict *resDict2 = new Dict(gfx->getXRef()); resDict2->set("XObject", Object(dict)); - appearBuf = new GooString (); + appearBuf = std::make_unique<GooString>(); appearBuf->append ("q\n"); appearBuf->appendf ("0 0 {0:d} {1:d} re W n\n", width, height); appearBuf->append ("q\n"); @@ -5129,13 +4854,13 @@ bbox[2] = width; bbox[3] = height; appearance = createForm(bbox, gFalse, resDict2); - delete appearBuf; + appearBuf = nullptr; } } // draw the appearance stream Object obj = appearance.fetch(gfx->getXRef()); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); } @@ -5158,39 +4883,29 @@ initialize(docA, dictObject->getDict()); } -AnnotScreen::~AnnotScreen() { - delete title; - delete appearCharacs; - delete action; -} - void AnnotScreen::initialize(PDFDoc *docA, Dict* dict) { Object obj1; - title = NULL; obj1 = dict->lookup("T"); if (obj1.isString()) { - title = obj1.getString()->copy(); + title.reset(obj1.getString()->copy()); } - action = NULL; obj1 = dict->lookup("A"); if (obj1.isDict()) { - action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI()); + action.reset(LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI())); if (action->getKind() == actionRendition && page == 0) { error (errSyntaxError, -1, "Invalid Rendition action: associated screen annotation without P"); - delete action; - action = NULL; + action = nullptr; ok = gFalse; } } additionalActions = dict->lookupNF("AA"); - appearCharacs = NULL; obj1 = dict->lookup("MK"); if (obj1.isDict()) { - appearCharacs = new AnnotAppearanceCharacs(obj1.getDict()); + appearCharacs = std::make_unique<AnnotAppearanceCharacs>(obj1.getDict()); } } @@ -5220,27 +4935,21 @@ initialize(docA, dictObject->getDict()); } -AnnotStamp::~AnnotStamp() { - delete icon; -} - void AnnotStamp::initialize(PDFDoc *docA, Dict* dict) { Object obj1 = dict->lookup("Name"); if (obj1.isName()) { - icon = new GooString(obj1.getName()); + icon = std::make_unique<GooString>(obj1.getName()); } else { - icon = new GooString("Draft"); + icon = std::make_unique<GooString>("Draft"); } } void AnnotStamp::setIcon(GooString *new_icon) { - delete icon; - if (new_icon) { - icon = new GooString (new_icon); + icon = std::make_unique<GooString>(new_icon); } else { - icon = new GooString(); + icon = std::make_unique<GooString>(); } update("Name", Object(objName, icon->getCString())); @@ -5275,12 +4984,6 @@ initialize(docA, dictObject->getDict()); } -AnnotGeometry::~AnnotGeometry() { - delete interiorColor; - delete borderEffect; - delete geometryRect; -} - void AnnotGeometry::initialize(PDFDoc *docA, Dict* dict) { Object obj1; @@ -5296,30 +4999,24 @@ obj1 = dict->lookup("IC"); if (obj1.isArray()) { - interiorColor = new AnnotColor(obj1.getArray()); - } else { - interiorColor = NULL; + interiorColor = std::make_unique<AnnotColor>(obj1.getArray()); } obj1 = dict->lookup("BS"); if (obj1.isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); + border = std::make_unique<AnnotBorderBS>(obj1.getDict()); } else if (!border) { - border = new AnnotBorderBS(); + border = std::make_unique<AnnotBorderBS>(); } obj1 = dict->lookup("BE"); if (obj1.isDict()) { - borderEffect = new AnnotBorderEffect(obj1.getDict()); - } else { - borderEffect = NULL; + borderEffect = std::make_unique<AnnotBorderEffect>(obj1.getDict()); } - geometryRect = NULL; obj1 = dict->lookup("RD"); if (obj1.isArray()) { - geometryRect = parseDiffRectangle(obj1.getArray(), rect); + geometryRect = parseDiffRectangle(obj1.getArray(), rect.get()); } } @@ -5342,15 +5039,13 @@ invalidateAppearance(); } -void AnnotGeometry::setInteriorColor(AnnotColor *new_color) { - delete interiorColor; - +void AnnotGeometry::setInteriorColor(std::unique_ptr<AnnotColor> &&new_color) { if (new_color) { Object obj1 = new_color->writeToObject(xref); update ("IC", std::move(obj1)); - interiorColor = new_color; + interiorColor = std::move(new_color); } else { - interiorColor = NULL; + interiorColor = nullptr; } invalidateAppearance(); } @@ -5365,16 +5060,16 @@ if (appearance.isNull()) { ca = opacity; - appearBuf = new GooString (); + appearBuf = std::make_unique<GooString>(); appearBuf->append ("q\n"); if (color) - setColor(color, gFalse); + setColor(color.get(), gFalse); double borderWidth = border->getWidth(); - setLineStyleForBorder(border); + setLineStyleForBorder(border.get()); if (interiorColor) - setColor(interiorColor, gTrue); + setColor(interiorColor.get(), gTrue); if (type == typeSquare) { appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} re\n", @@ -5444,18 +5139,16 @@ appearance = createForm(bbox, gFalse, nullptr); } else { Object aStream = createForm(bbox, gTrue, nullptr); - delete appearBuf; - - appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do"); Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL); appearance = createForm(bbox, gFalse, resDict); } - delete appearBuf; + appearBuf = nullptr; } // draw the appearance stream Object obj = appearance.fetch(gfx->getXRef()); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); } @@ -5493,16 +5186,6 @@ initialize(docA, dictObject->getDict()); } -AnnotPolygon::~AnnotPolygon() { - delete vertices; - - if (interiorColor) - delete interiorColor; - - if (borderEffect) - delete borderEffect; -} - void AnnotPolygon::initialize(PDFDoc *docA, Dict* dict) { Object obj1; @@ -5518,9 +5201,9 @@ obj1 = dict->lookup("Vertices"); if (obj1.isArray()) { - vertices = new AnnotPath(obj1.getArray()); + vertices = std::make_unique<AnnotPath>(obj1.getArray()); } else { - vertices = new AnnotPath(); + vertices = std::make_unique<AnnotPath>(); error(errSyntaxError, -1, "Bad Annot Polygon Vertices"); ok = gFalse; } @@ -5545,24 +5228,19 @@ obj1 = dict->lookup("IC"); if (obj1.isArray()) { - interiorColor = new AnnotColor(obj1.getArray()); - } else { - interiorColor = NULL; + interiorColor = std::make_unique<AnnotColor>(obj1.getArray()); } obj1 = dict->lookup("BS"); if (obj1.isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); + border = std::make_unique<AnnotBorderBS>(obj1.getDict()); } else if (!border) { - border = new AnnotBorderBS(); + border = std::make_unique<AnnotBorderBS>(); } obj1 = dict->lookup("BE"); if (obj1.isDict()) { - borderEffect = new AnnotBorderEffect(obj1.getDict()); - } else { - borderEffect = NULL; + borderEffect = std::make_unique<AnnotBorderEffect>(obj1.getDict()); } obj1 = dict->lookup("IT"); @@ -5601,15 +5279,13 @@ } void AnnotPolygon::setVertices(AnnotPath *path) { - delete vertices; - Array *a = new Array(xref); for (int i = 0; i < path->getCoordsLength(); i++) { a->add(Object(path->getX(i))); a->add(Object(path->getY(i))); } - vertices = new AnnotPath(a); + vertices = std::make_unique<AnnotPath>(a); update("Vertices", Object(a)); invalidateAppearance(); @@ -5627,15 +5303,11 @@ invalidateAppearance(); } -void AnnotPolygon::setInteriorColor(AnnotColor *new_color) { - delete interiorColor; - +void AnnotPolygon::setInteriorColor(std::unique_ptr<AnnotColor> &&new_color) { if (new_color) { Object obj1 = new_color->writeToObject(xref); update ("IC", std::move(obj1)); - interiorColor = new_color; - } else { - interiorColor = NULL; + interiorColor = std::move(new_color); } invalidateAppearance(); } @@ -5661,21 +5333,21 @@ annotLocker(); if (appearance.isNull()) { - appearBBox = new AnnotAppearanceBBox(rect); + appearBBox = std::make_unique<AnnotAppearanceBBox>(rect.get()); ca = opacity; - appearBuf = new GooString (); + appearBuf = std::make_unique<GooString>(); appearBuf->append ("q\n"); if (color) { - setColor(color, gFalse); + setColor(color.get(), gFalse); } - setLineStyleForBorder(border); + setLineStyleForBorder(border.get()); appearBBox->setBorderWidth(std::max(1., border->getWidth())); if (interiorColor) { - setColor(interiorColor, gTrue); + setColor(interiorColor.get(), gTrue); } if (vertices->getCoordsLength() != 0) { @@ -5706,24 +5378,22 @@ appearance = createForm(bbox, gFalse, nullptr); } else { Object aStream = createForm(bbox, gTrue, nullptr); - delete appearBuf; - - appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do"); Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL); appearance = createForm(bbox, gFalse, resDict); } - delete appearBuf; + appearBuf = nullptr; } // draw the appearance stream Object obj = appearance.fetch(gfx->getXRef()); if (appearBBox) { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), appearBBox->getPageXMin(), appearBBox->getPageYMin(), appearBBox->getPageXMax(), appearBBox->getPageYMax(), getRotation()); } else { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); } } @@ -5747,10 +5417,6 @@ initialize(docA, dictObject->getDict()); } -AnnotCaret::~AnnotCaret() { - delete caretRect; -} - void AnnotCaret::initialize(PDFDoc *docA, Dict* dict) { Object obj1; @@ -5767,9 +5433,7 @@ obj1 = dict->lookup("RD"); if (obj1.isArray()) { - caretRect = parseDiffRectangle(obj1.getArray(), rect); - } else { - caretRect = NULL; + caretRect = parseDiffRectangle(obj1.getArray(), rect.get()); } } @@ -5827,10 +5491,9 @@ obj1 = dict->lookup("BS"); if (obj1.isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); + border = std::make_unique<AnnotBorderBS>(obj1.getDict()); } else if (!border) { - border = new AnnotBorderBS(); + border = std::make_unique<AnnotBorderBS>(); } } @@ -5884,17 +5547,17 @@ annotLocker(); if (appearance.isNull()) { - appearBBox = new AnnotAppearanceBBox(rect); + appearBBox = std::make_unique<AnnotAppearanceBBox>(rect.get()); ca = opacity; - appearBuf = new GooString (); + appearBuf = std::make_unique<GooString>(); appearBuf->append ("q\n"); if (color) { - setColor(color, gFalse); + setColor(color.get(), gFalse); } - setLineStyleForBorder(border); + setLineStyleForBorder(border.get()); appearBBox->setBorderWidth(std::max(1., border->getWidth())); for (int i = 0; i < inkListLength; ++i) { @@ -5920,24 +5583,22 @@ appearance = createForm(bbox, gFalse, nullptr); } else { Object aStream = createForm(bbox, gTrue, nullptr); - delete appearBuf; - - appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do"); Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL); appearance = createForm(bbox, gFalse, resDict); } - delete appearBuf; + appearBuf = nullptr; } // draw the appearance stream Object obj = appearance.fetch(gfx->getXRef()); if (appearBBox) { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), appearBBox->getPageXMin(), appearBBox->getPageYMin(), appearBBox->getPageXMax(), appearBBox->getPageYMax(), getRotation()); } else { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); } } @@ -5963,10 +5624,6 @@ initialize(docA, dictObject->getDict()); } -AnnotFileAttachment::~AnnotFileAttachment() { - delete name; -} - void AnnotFileAttachment::initialize(PDFDoc *docA, Dict* dict) { Object obj1; @@ -5980,9 +5637,9 @@ obj1 = dict->lookup("Name"); if (obj1.isName()) { - name = new GooString(obj1.getName()); + name = std::make_unique<GooString>(obj1.getName()); } else { - name = new GooString("PushPin"); + name = std::make_unique<GooString>("PushPin"); } } @@ -6108,11 +5765,11 @@ if (appearance.isNull()) { ca = opacity; - appearBuf = new GooString (); + appearBuf = std::make_unique<GooString>(); appearBuf->append ("q\n"); if (color) - setColor(color, gTrue); + setColor(color.get(), gTrue); else appearBuf->append ("1 1 1 rg\n"); if (!name->cmp("PushPin")) @@ -6132,18 +5789,16 @@ appearance = createForm (bbox, gFalse, nullptr); } else { Object aStream = createForm (bbox, gTrue, nullptr); - delete appearBuf; - - appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do"); Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL); appearance = createForm(bbox, gFalse, resDict); } - delete appearBuf; + appearBuf = nullptr; } // draw the appearance stream Object obj = appearance.fetch(gfx->getXRef()); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); } @@ -6168,16 +5823,10 @@ initialize(docA, dictObject->getDict()); } -AnnotSound::~AnnotSound() { - delete sound; - - delete name; -} - void AnnotSound::initialize(PDFDoc *docA, Dict* dict) { Object obj1 = dict->lookup("Sound"); - sound = Sound::parseSound(&obj1); + sound.reset(Sound::parseSound(&obj1)); if (!sound) { error(errSyntaxError, -1, "Bad Annot Sound"); ok = gFalse; @@ -6185,9 +5834,9 @@ obj1 = dict->lookup("Name"); if (obj1.isName()) { - name = new GooString(obj1.getName()); + name = std::make_unique<GooString>(obj1.getName()); } else { - name = new GooString("Speaker"); + name = std::make_unique<GooString>("Speaker"); } } @@ -6265,11 +5914,11 @@ if (appearance.isNull()) { ca = opacity; - appearBuf = new GooString (); + appearBuf = std::make_unique<GooString>(); appearBuf->append ("q\n"); if (color) - setColor(color, gTrue); + setColor(color.get(), gTrue); else appearBuf->append ("1 1 1 rg\n"); if (!name->cmp("Speaker")) @@ -6285,18 +5934,16 @@ appearance = createForm(bbox, gFalse, nullptr); } else { Object aStream = createForm(bbox, gTrue, nullptr); - delete appearBuf; - - appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do"); Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL); appearance = createForm(bbox, gFalse, resDict); } - delete appearBuf; + appearBuf = nullptr; } // draw the appearance stream obj = appearance.fetch(gfx->getXRef()); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(), rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); } @@ -6320,17 +5967,10 @@ initialize(docA, dictObject->getDict()); } -Annot3D::~Annot3D() { - if (activation) - delete activation; -} - void Annot3D::initialize(PDFDoc *docA, Dict* dict) { Object obj1 = dict->lookup("3DA"); if (obj1.isDict()) { - activation = new Activation(obj1.getDict()); - } else { - activation = NULL; + activation = std::make_unique<Activation>(obj1.getDict()); } } @@ -6438,62 +6078,44 @@ initialize(docA, dictObject->getDict()); } -AnnotRichMedia::~AnnotRichMedia() { - delete content; - delete settings; -} - void AnnotRichMedia::initialize(PDFDoc *docA, Dict* dict) { Object obj1 = dict->lookup("RichMediaContent"); if (obj1.isDict()) { - content = new AnnotRichMedia::Content(obj1.getDict()); - } else { - content = NULL; + content = std::make_unique<AnnotRichMedia::Content>(obj1.getDict()); } obj1 = dict->lookup("RichMediaSettings"); if (obj1.isDict()) { - settings = new AnnotRichMedia::Settings(obj1.getDict()); - } else { - settings = NULL; + settings = std::make_unique<AnnotRichMedia::Settings>(obj1.getDict()); } } AnnotRichMedia::Content* AnnotRichMedia::getContent() const { - return content; + return content.get(); } AnnotRichMedia::Settings* AnnotRichMedia::getSettings() const { - return settings; + return settings.get(); } AnnotRichMedia::Settings::Settings(Dict *dict) { Object obj1 = dict->lookup("Activation"); if (obj1.isDict()) { - activation = new AnnotRichMedia::Activation(obj1.getDict()); - } else { - activation = NULL; + activation = std::make_unique<AnnotRichMedia::Activation>(obj1.getDict()); } obj1 = dict->lookup("Deactivation"); if (obj1.isDict()) { - deactivation = new AnnotRichMedia::Deactivation(obj1.getDict()); - } else { - deactivation = NULL; + deactivation = std::make_unique<AnnotRichMedia::Deactivation>(obj1.getDict()); } } -AnnotRichMedia::Settings::~Settings() { - delete activation; - delete deactivation; -} - AnnotRichMedia::Activation* AnnotRichMedia::Settings::getActivation() const { - return activation; + return activation.get(); } AnnotRichMedia::Deactivation* AnnotRichMedia::Settings::getDeactivation() const { - return deactivation; + return deactivation.get(); } AnnotRichMedia::Activation::Activation(Dict *dict) { @@ -6579,7 +6201,7 @@ Object objKey = obj2.arrayGet(i); assets[counter]->fileSpec = obj2.arrayGet(i + 1); - assets[counter]->name = new GooString( objKey.getString() ); + assets[counter]->name = std::make_unique<GooString>( objKey.getString() ); ++counter; } @@ -6623,18 +6245,8 @@ return assets[index]; } -AnnotRichMedia::Asset::Asset() - : name(NULL) -{ -} - -AnnotRichMedia::Asset::~Asset() -{ - delete name; -} - GooString* AnnotRichMedia::Asset::getName() const { - return name; + return name.get(); } Object* AnnotRichMedia::Asset::getFileSpec() const { @@ -6663,9 +6275,7 @@ obj1 = dict->lookup("Name"); if (obj1.isString()) { - name = new GooString(obj1.getString()); - } else { - name = NULL; + name = std::make_unique<GooString>(obj1.getString()); } obj1 = dict->lookup("Subtype"); @@ -6713,8 +6323,6 @@ delete instances[i]; gfree(instances); } - - delete name; } int AnnotRichMedia::Configuration::getInstancesCount() const { @@ -6729,7 +6337,7 @@ } GooString* AnnotRichMedia::Configuration::getName() const { - return name; + return name.get(); } AnnotRichMedia::Configuration::Type AnnotRichMedia::Configuration::getType() const { @@ -6755,42 +6363,28 @@ obj1 = dict->lookup("Params"); if (obj1.isDict()) { - params = new AnnotRichMedia::Params(obj1.getDict()); - } else { - params = NULL; + params = std::make_unique<AnnotRichMedia::Params>(obj1.getDict()); } } -AnnotRichMedia::Instance::~Instance() -{ - delete params; -} - AnnotRichMedia::Instance::Type AnnotRichMedia::Instance::getType() const { return type; } AnnotRichMedia::Params* AnnotRichMedia::Instance::getParams() const { - return params; + return params.get(); } AnnotRichMedia::Params::Params(Dict *dict) { Object obj1 = dict->lookup("FlashVars"); if (obj1.isString()) { - flashVars = new GooString(obj1.getString()); - } else { - flashVars = NULL; + flashVars = std::unique_ptr<GooString>(obj1.getString()); } } -AnnotRichMedia::Params::~Params() -{ - delete flashVars; -} - GooString* AnnotRichMedia::Params::getFlashVars() const { - return flashVars; + return flashVars.get(); } //------------------------------------------------------------------------
diff --git a/poppler/Annot.h b/poppler/Annot.h index 171494a..2e33315 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h
@@ -88,7 +88,7 @@ double getX() const { return x; } double getY() const { return y; } - + protected: double x, y; @@ -102,15 +102,15 @@ public: AnnotPath(); AnnotPath(Array *array); - AnnotPath(AnnotCoord **coords, int coordLength); - ~AnnotPath(); + AnnotPath(std::unique_ptr<AnnotCoord[]> &&coords, int coordsLength); + ~AnnotPath() = default; double getX(int coord) const; double getY(int coord) const; AnnotCoord *getCoord(int coord) const; int getCoordsLength() const { return coordsLength; } protected: - AnnotCoord **coords; + std::unique_ptr<AnnotCoord[]> coords; int coordsLength; void parsePathArray(Array *array); @@ -185,6 +185,7 @@ public: class AnnotQuadrilateral { public: + AnnotQuadrilateral() = default; AnnotQuadrilateral(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4); @@ -192,8 +193,8 @@ }; AnnotQuadrilaterals(Array *array, PDFRectangle *rect); - AnnotQuadrilaterals(AnnotQuadrilateral **quads, int quadsLength); - ~AnnotQuadrilaterals(); + AnnotQuadrilaterals(std::unique_ptr<AnnotQuadrilateral[]> &&quads, int quadsLength); + ~AnnotQuadrilaterals() = default; double getX1(int quadrilateral); double getY1(int quadrilateral); @@ -206,7 +207,7 @@ int getQuadrilateralsLength() const { return quadrilateralsLength; } protected: - AnnotQuadrilateral** quadrilaterals; + std::unique_ptr<AnnotQuadrilateral[]> quadrilaterals; int quadrilateralsLength; }; @@ -388,7 +389,7 @@ Object getAppearanceStream(AnnotAppearanceType type, const char *state); // Access keys in normal appearance subdictionary (N) - GooString * getStateKey(int i); + std::unique_ptr<GooString> getStateKey(int i); int getNumStates(); // Removes all associated streams in the xref table. Caller is required to @@ -427,30 +428,30 @@ }; AnnotAppearanceCharacs(Dict *dict); - ~AnnotAppearanceCharacs(); + ~AnnotAppearanceCharacs() = default; int getRotation() { return rotation; } - AnnotColor *getBorderColor() { return borderColor; } - AnnotColor *getBackColor() { return backColor; } - GooString *getNormalCaption() { return normalCaption; } - GooString *getRolloverCaption() { return rolloverCaption; } - GooString *getAlternateCaption() { return alternateCaption; } - AnnotIconFit *getIconFit() { return iconFit; } + AnnotColor *getBorderColor() { return borderColor.get(); } + AnnotColor *getBackColor() { return backColor.get(); } + GooString *getNormalCaption() { return normalCaption.get(); } + GooString *getRolloverCaption() { return rolloverCaption.get(); } + GooString *getAlternateCaption() { return alternateCaption.get(); } + AnnotIconFit *getIconFit() { return iconFit.get(); } AnnotAppearanceCharacsTextPos getPosition() { return position; } protected: - int rotation; // R (Default 0) - AnnotColor *borderColor; // BC - AnnotColor *backColor; // BG - GooString *normalCaption; // CA - GooString *rolloverCaption; // RC - GooString *alternateCaption; // AC + int rotation; // R (Default 0) + std::unique_ptr<AnnotColor> borderColor; // BC + std::unique_ptr<AnnotColor> backColor; // BG + std::unique_ptr<GooString> normalCaption; // CA + std::unique_ptr<GooString> rolloverCaption; // RC + std::unique_ptr<GooString> alternateCaption; // AC // I // RI // IX - AnnotIconFit *iconFit; // IF - AnnotAppearanceCharacsTextPos position; // TP (Default 0) + std::unique_ptr<AnnotIconFit> iconFit; // IF + AnnotAppearanceCharacsTextPos position; // TP (Default 0) }; //------------------------------------------------------------------------ @@ -586,11 +587,8 @@ void setModified(GooString *new_date); void setFlags(Guint new_flags); - void setBorder(AnnotBorder *new_border); // Takes ownership - - // The annotation takes the ownership of - // new_color. - void setColor(AnnotColor *new_color); + void setBorder(std::unique_ptr<AnnotBorder> &&new_border); + void setColor(std::unique_ptr<AnnotColor> &&new_color); void setAppearanceState(const char *state); @@ -600,17 +598,17 @@ GBool getHasRef() const { return hasRef; } Ref getRef() const { return ref; } AnnotSubtype getType() const { return type; } - PDFRectangle *getRect() const { return rect; } + PDFRectangle *getRect() const { return rect.get(); } void getRect(double *x1, double *y1, double *x2, double *y2) const; - GooString *getContents() const { return contents; } + GooString *getContents() const { return contents.get(); } int getPageNum() const { return page; } - GooString *getName() const { return name; } - GooString *getModified() const { return modified; } + GooString *getName() const { return name.get(); } + GooString *getModified() const { return modified.get(); } Guint getFlags() const { return flags; } - AnnotAppearance *getAppearStreams() const { return appearStreams; } - GooString *getAppearState() const { return appearState; } - AnnotBorder *getBorder() const { return border; } - AnnotColor *getColor() const { return color; } + AnnotAppearance *getAppearStreams() const { return appearStreams.get(); } + GooString *getAppearState() const { return appearState.get(); } + AnnotBorder *getBorder() const { return border.get(); } + AnnotColor *getColor() const { return color.get(); } int getTreeKey() const { return treeKey; } int getId() { return ref.num; } @@ -656,30 +654,30 @@ int refCnt; // required data - AnnotSubtype type; // Annotation type - PDFRectangle *rect; // Rect + AnnotSubtype type; // Annotation type + std::unique_ptr<PDFRectangle> rect; // Rect // optional data - GooString *contents; // Contents - GooString *name; // NM - GooString *modified; // M - int page; // P - Guint flags; // F (must be a 32 bit unsigned int) - AnnotAppearance *appearStreams; // AP - Object appearance; // a reference to the Form XObject stream - // for the normal appearance - AnnotAppearanceBBox *appearBBox; // BBox of generated appearance - GooString *appearState; // AS - int treeKey; // Struct Parent; - Object oc; // OC + std::unique_ptr<GooString> contents; // Contents + std::unique_ptr<GooString> name; // NM + std::unique_ptr<GooString> modified; // M + int page; // P + Guint flags; // F (must be a 32 bit unsigned int) + std::unique_ptr<AnnotAppearance> appearStreams; // AP + Object appearance; // a reference to the Form XObject stream + // for the normal appearance + std::unique_ptr<AnnotAppearanceBBox> appearBBox; // BBox of generated appearance + std::unique_ptr<GooString> appearState; // AS + int treeKey; // Struct Parent; + Object oc; // OC PDFDoc *doc; - XRef *xref; // the xref table for this PDF file - Ref ref; // object ref identifying this annotation - GooString *appearBuf; - AnnotBorder *border; // Border, BS - AnnotColor *color; // C - double fontSize; + XRef *xref; // the xref table for this PDF file + Ref ref; // object ref identifying this annotation + std::unique_ptr<GooString> appearBuf; + std::unique_ptr<AnnotBorder> border; // Border, BS + std::unique_ptr<AnnotColor> color; // C + double fontSize; GBool ok; bool hasRef; @@ -724,21 +722,21 @@ AnnotMarkup(PDFDoc *docA, PDFRectangle *rect); AnnotMarkup(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotMarkup(); + ~AnnotMarkup() = default; // getters - GooString *getLabel() const { return label; } - AnnotPopup *getPopup() const { return popup; } + GooString *getLabel() const { return label.get(); } + AnnotPopup *getPopup() const { return popup.get(); } double getOpacity() const { return opacity; } // getRC - GooString *getDate() const { return date; } + GooString *getDate() const { return date.get(); } int getInReplyToID() const { return inReplyTo.num; } - GooString *getSubject() const { return subject; } + GooString *getSubject() const { return subject.get(); } AnnotMarkupReplyType getReplyTo() const { return replyTo; } AnnotExternalDataType getExData() const { return exData; } // The annotation takes the ownership of new_popup - void setPopup(AnnotPopup *new_popup); + void setPopup(std::unique_ptr<AnnotPopup> &&new_popup); void setLabel(GooString *new_label); void setOpacity(double opacityA); void setDate(GooString *new_date); @@ -746,18 +744,18 @@ protected: void removeReferencedObjects() override; - GooString *label; // T (Default autor) - AnnotPopup *popup; // Popup - double opacity; // CA (Default 1.0) + std::unique_ptr<GooString> label; // T (Default autor) + std::unique_ptr<AnnotPopup> popup; // Popup + double opacity; // CA (Default 1.0) // RC - GooString *date; // CreationDate - Ref inReplyTo; // IRT - GooString *subject; // Subj - AnnotMarkupReplyType replyTo; // RT (Default R) + std::unique_ptr<GooString> date; // CreationDate + Ref inReplyTo; // IRT + std::unique_ptr<GooString> subject; // Subj + AnnotMarkupReplyType replyTo; // RT (Default R) // this object is overrided by the custom intent fields defined in some // annotation types. - //GooString *intent; // IT - AnnotExternalDataType exData; // ExData + //GooString *intent; // IT + AnnotExternalDataType exData; // ExData private: void initialize(PDFDoc *docA, Dict *dict, Object *obj); @@ -784,13 +782,13 @@ AnnotText(PDFDoc *docA, PDFRectangle *rect); AnnotText(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotText(); + ~AnnotText() = default; void draw(Gfx *gfx, GBool printing) override; // getters GBool getOpen() const { return open; } - GooString *getIcon() const { return icon; } + GooString *getIcon() const { return icon.get(); } AnnotTextState getState() const { return state; } void setOpen(GBool openA); @@ -801,7 +799,7 @@ void initialize(PDFDoc *docA, Dict *dict); GBool open; // Open (Default false) - GooString *icon; // Name (Default Note) + std::unique_ptr<GooString> icon; // Name (Default Note) AnnotTextState state; // State (Default Umarked if // StateModel Marked // None if StareModel Review) @@ -817,18 +815,18 @@ public: AnnotMovie(PDFDoc *docA, PDFRectangle *rect, Movie *movieA); AnnotMovie(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotMovie(); + ~AnnotMovie() = default; void draw(Gfx *gfx, GBool printing) override; - GooString* getTitle() { return title; } - Movie* getMovie() { return movie; } + GooString* getTitle() { return title.get(); } + Movie* getMovie() { return movie.get(); } private: void initialize(PDFDoc *docA, Dict *dict); - GooString* title; // T - Movie* movie; // Movie + A + std::unique_ptr<GooString> title; // T + std::unique_ptr<Movie> movie; // Movie + A }; @@ -841,24 +839,24 @@ AnnotScreen(PDFDoc *docA, PDFRectangle *rect); AnnotScreen(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotScreen(); + ~AnnotScreen() = default; - GooString* getTitle() { return title; } + GooString* getTitle() { return title.get(); } - AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs; } - LinkAction* getAction() { return action; } // The caller should now delete the result + AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs.get(); } + LinkAction *getAction() { return action.get(); } // The caller should now delete the result LinkAction *getAdditionalAction(AdditionalActionsType type); // The caller should delete the result private: void initialize(PDFDoc *docA, Dict *dict); - GooString* title; // T + std::unique_ptr<GooString> title; // T - AnnotAppearanceCharacs* appearCharacs; // MK + std::unique_ptr<AnnotAppearanceCharacs> appearCharacs; // MK - LinkAction *action; // A - Object additionalActions; // AA + std::unique_ptr<LinkAction> action; // A + Object additionalActions; // AA }; //------------------------------------------------------------------------ @@ -877,25 +875,25 @@ AnnotLink(PDFDoc *docA, PDFRectangle *rect); AnnotLink(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotLink(); + ~AnnotLink() = default; void draw(Gfx *gfx, GBool printing) override; // getters - LinkAction *getAction() const { return action; } + LinkAction *getAction() const { return action.get(); } AnnotLinkEffect getLinkEffect() const { return linkEffect; } - Dict *getUriAction() const { return uriAction; } - AnnotQuadrilaterals *getQuadrilaterals() const { return quadrilaterals; } + /* Dict *getUriAction() const { return uriAction; } */ + AnnotQuadrilaterals *getQuadrilaterals() const { return quadrilaterals.get(); } protected: void initialize(PDFDoc *docA, Dict *dict); - LinkAction *action; // A, Dest - AnnotLinkEffect linkEffect; // H (Default I) - Dict *uriAction; // PA + std::unique_ptr<LinkAction> action; // A, Dest + AnnotLinkEffect linkEffect; // H (Default I) + //Dict *uriAction; // PA - AnnotQuadrilaterals *quadrilaterals; // QuadPoints + std::unique_ptr<AnnotQuadrilaterals> quadrilaterals; // QuadPoints }; //------------------------------------------------------------------------ @@ -919,7 +917,7 @@ AnnotFreeText(PDFDoc *docA, PDFRectangle *rect, GooString *da); AnnotFreeText(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotFreeText(); + ~AnnotFreeText() = default; void draw(Gfx *gfx, GBool printing) override; Object getAppearanceResDict() override; @@ -932,36 +930,36 @@ void setIntent(AnnotFreeTextIntent new_intent); // getters - GooString *getAppearanceString() const { return appearanceString; } + GooString *getAppearanceString() const { return appearanceString.get(); } AnnotFreeTextQuadding getQuadding() const { return quadding; } // return rc - GooString *getStyleString() const { return styleString; } - AnnotCalloutLine *getCalloutLine() const { return calloutLine; } + GooString *getStyleString() const { return styleString.get(); } + AnnotCalloutLine *getCalloutLine() const { return calloutLine.get(); } AnnotFreeTextIntent getIntent() const { return intent; } - AnnotBorderEffect *getBorderEffect() const { return borderEffect; } - PDFRectangle *getRectangle() const { return rectangle; } + AnnotBorderEffect *getBorderEffect() const { return borderEffect.get(); } + PDFRectangle *getRectangle() const { return rectangle.get(); } AnnotLineEndingStyle getEndStyle() const { return endStyle; } protected: void initialize(PDFDoc *docA, Dict *dict); - static void parseAppearanceString(GooString *da, double &fontsize, AnnotColor* &fontcolor); + static void parseAppearanceString(GooString *da, double &fontsize, std::unique_ptr<AnnotColor> &fontcolor); void generateFreeTextAppearance(); // required - GooString *appearanceString; // DA + std::unique_ptr<GooString> appearanceString; // DA // optional - AnnotFreeTextQuadding quadding; // Q (Default 0) + AnnotFreeTextQuadding quadding; // Q (Default 0) // RC - GooString *styleString; // DS - AnnotCalloutLine *calloutLine; // CL - AnnotFreeTextIntent intent; // IT - AnnotBorderEffect *borderEffect; // BE - PDFRectangle *rectangle; // RD + std::unique_ptr<GooString> styleString; // DS + std::unique_ptr<AnnotCalloutLine> calloutLine; // CL + AnnotFreeTextIntent intent; // IT + std::unique_ptr<AnnotBorderEffect> borderEffect; // BE + std::unique_ptr<PDFRectangle> rectangle; // RD // inherited from Annot - // AnnotBorderBS border; // BS - AnnotLineEndingStyle endStyle; // LE (Default None) + // AnnotBorderBS border; // BS + AnnotLineEndingStyle endStyle; // LE (Default None) }; //------------------------------------------------------------------------ @@ -983,7 +981,7 @@ AnnotLine(PDFDoc *docA, PDFRectangle *rect); AnnotLine(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotLine(); + ~AnnotLine() = default; void draw(Gfx *gfx, GBool printing) override; Object getAppearanceResDict() override; @@ -991,7 +989,7 @@ void setVertices(double x1, double y1, double x2, double y2); void setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end); - void setInteriorColor(AnnotColor *new_color); + void setInteriorColor(std::unique_ptr<AnnotColor> &&new_color); void setLeaderLineLength(double len); void setLeaderLineExtension(double len); void setCaption(bool new_cap); @@ -1000,7 +998,7 @@ // getters AnnotLineEndingStyle getStartStyle() const { return startStyle; } AnnotLineEndingStyle getEndStyle() const { return endStyle; } - AnnotColor *getInteriorColor() const { return interiorColor; } + AnnotColor *getInteriorColor() const { return interiorColor.get(); } double getLeaderLineLength() const { return leaderLineLength; } double getLeaderLineExtension() const { return leaderLineExtension; } bool getCaption() const { return caption; } @@ -1021,23 +1019,24 @@ void generateLineAppearance(); // required - AnnotCoord *coord1, *coord2; - + std::unique_ptr<AnnotCoord> coord1; + std::unique_ptr<AnnotCoord> coord2; + // optional // inherited from Annot - // AnnotBorderBS border; // BS - AnnotLineEndingStyle startStyle; // LE (Default [/None /None]) - AnnotLineEndingStyle endStyle; // - AnnotColor *interiorColor; // IC - double leaderLineLength; // LL (Default 0) - double leaderLineExtension; // LLE (Default 0) - bool caption; // Cap (Default false) - AnnotLineIntent intent; // IT - double leaderLineOffset; // LLO - AnnotLineCaptionPos captionPos; // CP (Default Inline) - Dict *measure; // Measure - double captionTextHorizontal; // CO (Default [0, 0]) - double captionTextVertical; // + // AnnotBorderBS border; // BS + AnnotLineEndingStyle startStyle; // LE (Default [/None /None]) + AnnotLineEndingStyle endStyle; // + std::unique_ptr<AnnotColor> interiorColor; // IC + double leaderLineLength; // LL (Default 0) + double leaderLineExtension; // LLE (Default 0) + bool caption; // Cap (Default false) + AnnotLineIntent intent; // IT + double leaderLineOffset; // LLO + AnnotLineCaptionPos captionPos; // CP (Default Inline) + Dict *measure; // Measure + double captionTextHorizontal; // CO (Default [0, 0]) + double captionTextVertical; // }; //------------------------------------------------------------------------ @@ -1049,7 +1048,7 @@ AnnotTextMarkup(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType); AnnotTextMarkup(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotTextMarkup(); + ~AnnotTextMarkup() = default; void draw(Gfx *gfx, GBool printing) override; @@ -1058,13 +1057,13 @@ void setQuadrilaterals(AnnotQuadrilaterals *quadPoints); - AnnotQuadrilaterals *getQuadrilaterals() const { return quadrilaterals; } + AnnotQuadrilaterals *getQuadrilaterals() const { return quadrilaterals.get(); } protected: void initialize(PDFDoc *docA, Dict *dict); - - AnnotQuadrilaterals *quadrilaterals; // QuadPoints + + std::unique_ptr<AnnotQuadrilaterals> quadrilaterals; // QuadPoints }; //------------------------------------------------------------------------ @@ -1076,18 +1075,18 @@ AnnotStamp(PDFDoc *docA, PDFRectangle *rect); AnnotStamp(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotStamp(); + ~AnnotStamp() = default; void setIcon(GooString *new_icon); // getters - GooString *getIcon() const { return icon; } + GooString *getIcon() const { return icon.get(); } private: void initialize(PDFDoc *docA, Dict *dict); - GooString *icon; // Name (Default Draft) + std::unique_ptr<GooString> icon; // Name (Default Draft) }; //------------------------------------------------------------------------ @@ -1099,25 +1098,25 @@ AnnotGeometry(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType); AnnotGeometry(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotGeometry(); + ~AnnotGeometry() = default; void draw(Gfx *gfx, GBool printing) override; void setType(AnnotSubtype new_type); // typeSquare or typeCircle - void setInteriorColor(AnnotColor *new_color); + void setInteriorColor(std::unique_ptr<AnnotColor> &&new_color); // getters - AnnotColor *getInteriorColor() const { return interiorColor; } - AnnotBorderEffect *getBorderEffect() const { return borderEffect; } - PDFRectangle *getGeometryRect() const { return geometryRect; } + AnnotColor *getInteriorColor() const { return interiorColor.get(); } + AnnotBorderEffect *getBorderEffect() const { return borderEffect.get(); } + PDFRectangle *getGeometryRect() const { return geometryRect.get(); } private: void initialize(PDFDoc *docA, Dict *dict); - AnnotColor *interiorColor; // IC - AnnotBorderEffect *borderEffect; // BE - PDFRectangle *geometryRect; // RD (combined with Rect) + std::unique_ptr<AnnotColor> interiorColor; // IC + std::unique_ptr<AnnotBorderEffect> borderEffect; // BE + std::unique_ptr<PDFRectangle> geometryRect; // RD (combined with Rect) }; //------------------------------------------------------------------------ @@ -1135,22 +1134,22 @@ AnnotPolygon(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType); AnnotPolygon(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotPolygon(); + ~AnnotPolygon() = default; void draw(Gfx *gfx, GBool printing) override; void setType(AnnotSubtype new_type); // typePolygon or typePolyLine void setVertices(AnnotPath *path); void setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end); - void setInteriorColor(AnnotColor *new_color); + void setInteriorColor(std::unique_ptr<AnnotColor> &&new_color); void setIntent(AnnotPolygonIntent new_intent); // getters - AnnotPath *getVertices() const { return vertices; } + AnnotPath *getVertices() const { return vertices.get(); } AnnotLineEndingStyle getStartStyle() const { return startStyle; } AnnotLineEndingStyle getEndStyle() const { return endStyle; } - AnnotColor *getInteriorColor() const { return interiorColor; } - AnnotBorderEffect *getBorderEffect() const { return borderEffect; } + AnnotColor *getInteriorColor() const { return interiorColor.get(); } + AnnotBorderEffect *getBorderEffect() const { return borderEffect.get(); } AnnotPolygonIntent getIntent() const { return intent; } private: @@ -1158,16 +1157,16 @@ void initialize(PDFDoc *docA, Dict *dict); // required - AnnotPath *vertices; // Vertices + std::unique_ptr<AnnotPath> vertices; // Vertices // optional - AnnotLineEndingStyle startStyle; // LE (Default [/None /None]) - AnnotLineEndingStyle endStyle; // + AnnotLineEndingStyle startStyle; // LE (Default [/None /None]) + AnnotLineEndingStyle endStyle; // // inherited from Annot - // AnnotBorderBS border; // BS - AnnotColor *interiorColor; // IC - AnnotBorderEffect *borderEffect; // BE - AnnotPolygonIntent intent; // IT + // AnnotBorderBS border; // BS + std::unique_ptr<AnnotColor> interiorColor; // IC + std::unique_ptr<AnnotBorderEffect> borderEffect; // BE + AnnotPolygonIntent intent; // IT // Measure }; @@ -1185,20 +1184,20 @@ AnnotCaret(PDFDoc *docA, PDFRectangle *rect); AnnotCaret(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotCaret(); + ~AnnotCaret() = default; void setSymbol(AnnotCaretSymbol new_symbol); // getters AnnotCaretSymbol getSymbol() const { return symbol; } - PDFRectangle *getCaretRect() const { return caretRect; } + PDFRectangle *getCaretRect() const { return caretRect.get(); } private: void initialize(PDFDoc *docA, Dict *dict); - AnnotCaretSymbol symbol; // Sy (Default None) - PDFRectangle *caretRect; // RD (combined with Rect) + AnnotCaretSymbol symbol; // Sy (Default None) + std::unique_ptr<PDFRectangle> caretRect; // RD (combined with Rect) }; //------------------------------------------------------------------------ @@ -1245,23 +1244,23 @@ AnnotFileAttachment(PDFDoc *docA, PDFRectangle *rect, GooString *filename); AnnotFileAttachment(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotFileAttachment(); + ~AnnotFileAttachment() = default; void draw(Gfx *gfx, GBool printing) override; // getters Object *getFile() { return &file; } - GooString *getName() const { return name; } + GooString *getName() const { return name.get(); } private: void initialize(PDFDoc *docA, Dict *dict); // required - Object file; // FS + Object file; // FS // optional - GooString *name; // Name + std::unique_ptr<GooString> name; // Name }; //------------------------------------------------------------------------ @@ -1273,23 +1272,23 @@ AnnotSound(PDFDoc *docA, PDFRectangle *rect, Sound *soundA); AnnotSound(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotSound(); + ~AnnotSound() = default; void draw(Gfx *gfx, GBool printing) override; // getters - Sound *getSound() { return sound; } - GooString *getName() const { return name; } + Sound *getSound() { return sound.get(); } + GooString *getName() const { return name.get(); } private: void initialize(PDFDoc *docA, Dict *dict); // required - Sound *sound; // Sound + std::unique_ptr<Sound> sound; // Sound // optional - GooString *name; // Name + std::unique_ptr<GooString> name; // Name }; //------------------------------------------------------------------------ @@ -1308,7 +1307,7 @@ AnnotWidget(PDFDoc *docA, Object *dictObject, Object *obj); AnnotWidget(PDFDoc *docA, Object *dictObject, Object *obj, FormField *fieldA); - ~AnnotWidget(); + ~AnnotWidget() = default; void draw(Gfx *gfx, GBool printing) override; @@ -1320,8 +1319,8 @@ void updateAppearanceStream (); AnnotWidgetHighlightMode getMode() { return mode; } - AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs; } - LinkAction *getAction() { return action; } // The caller should not delete the result + AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs.get(); } + LinkAction *getAction() { return action.get(); } // The caller should not delete the result LinkAction *getAdditionalAction(AdditionalActionsType type); // The caller should delete the result LinkAction *getFormAdditionalAction(FormAdditionalActionsType type); // The caller should delete the result Dict *getParent() { return parent; } @@ -1338,14 +1337,14 @@ GooString *da, GfxResources *resources, int quadding); Form *form; - FormField *field; // FormField object for this annotation - AnnotWidgetHighlightMode mode; // H (Default I) - AnnotAppearanceCharacs *appearCharacs; // MK - LinkAction *action; // A - Object additionalActions; // AA + FormField *field; // FormField object for this annotation + AnnotWidgetHighlightMode mode; // H (Default I) + std::unique_ptr<AnnotAppearanceCharacs> appearCharacs; // MK + std::unique_ptr<LinkAction> action; // A + Object additionalActions; // AA // inherited from Annot - // AnnotBorderBS border; // BS - Dict *parent; // Parent + // AnnotBorderBS border; // BS + Dict *parent; // Parent GBool addDingbatsResource; Ref updatedAppearanceStream; // {-1,-1} if updateAppearanceStream has never been called }; @@ -1398,7 +1397,7 @@ Annot3D(PDFDoc *docA, PDFRectangle *rect); Annot3D(PDFDoc *docA, Object *dictObject, Object *obj); - ~Annot3D(); + ~Annot3D() = default; // getters @@ -1406,7 +1405,7 @@ void initialize(PDFDoc *docA, Dict *dict); - Activation *activation; // 3DA + std::unique_ptr<Activation> activation; // 3DA }; //------------------------------------------------------------------------ @@ -1418,13 +1417,13 @@ class Params { public: Params(Dict *dict); - ~Params(); + ~Params() = default; GooString* getFlashVars() const; private: // optional - GooString *flashVars; // FlashVars + std::unique_ptr<GooString> flashVars; // FlashVars }; class Instance { @@ -1437,15 +1436,15 @@ }; Instance(Dict *dict); - ~Instance(); + ~Instance() = default; Type getType() const; Params* getParams() const; private: // optional - Type type; // Subtype - Params *params; // Params + Type type; // Subtype + std::unique_ptr<Params> params; // Params }; class Configuration { @@ -1467,9 +1466,9 @@ private: // optional - Type type; // Subtype - GooString *name; // Name - Instance **instances; // Instances + Type type; // Subtype + std::unique_ptr<GooString> name; // Name + Instance **instances; // Instances int nInstances; }; @@ -1477,8 +1476,8 @@ class Asset { public: - Asset(); - ~Asset(); + Asset() = default; + ~Asset() = default; GooString* getName() const; Object* getFileSpec() const; @@ -1486,7 +1485,7 @@ private: friend class AnnotRichMedia::Content; - GooString *name; + std::unique_ptr<GooString> name; Object fileSpec; }; @@ -1503,7 +1502,7 @@ private: // optional - Configuration **configurations; // Configurations + Configuration** configurations; // Configurations int nConfigurations; Asset **assets; // Assets @@ -1547,20 +1546,20 @@ class Settings { public: Settings(Dict *dict); - ~Settings(); + ~Settings() = default; Activation* getActivation() const; Deactivation* getDeactivation() const; private: // optional - Activation *activation; - Deactivation *deactivation; + std::unique_ptr<Activation> activation; + std::unique_ptr<Deactivation> deactivation; }; AnnotRichMedia(PDFDoc *docA, PDFRectangle *rect); AnnotRichMedia(PDFDoc *docA, Object *dictObject, Object *obj); - ~AnnotRichMedia(); + ~AnnotRichMedia() = default; Content* getContent() const; @@ -1570,10 +1569,10 @@ void initialize(PDFDoc *docA, Dict *dict); // required - Content *content; // RichMediaContent + std::unique_ptr<Content> content; // RichMediaContent // optional - Settings *settings; // RichMediaSettings + std::unique_ptr<Settings> settings; // RichMediaSettings };
diff --git a/qt4/src/poppler-annotation-helper.h b/qt4/src/poppler-annotation-helper.h index 3150569..8419b0b 100644 --- a/qt4/src/poppler-annotation-helper.h +++ b/qt4/src/poppler-annotation-helper.h
@@ -176,6 +176,6 @@ } QColor convertAnnotColor( AnnotColor *color ); -AnnotColor* convertQColor( const QColor &color ); +std::unique_ptr<AnnotColor> convertQColor( const QColor &color ); }
diff --git a/qt4/src/poppler-annotation.cc b/qt4/src/poppler-annotation.cc index 8a7f60b..f4733b8 100644 --- a/qt4/src/poppler-annotation.cc +++ b/qt4/src/poppler-annotation.cc
@@ -350,7 +350,7 @@ AnnotPath * AnnotationPrivate::toAnnotPath(const QLinkedList<QPointF> &list) const { const int count = list.size(); - AnnotCoord **ac = (AnnotCoord **) gmallocn(count, sizeof(AnnotCoord*)); + auto ac = std::make_unique<AnnotCoord[]>(count); double MTX[6]; fillTransformationMTX(MTX); @@ -360,10 +360,10 @@ { double x, y; XPDFReader::invTransform( MTX, p, x, y ); - ac[pos++] = new AnnotCoord(x, y); + ac[pos++] = AnnotCoord(x, y); } - return new AnnotPath(ac, count); + return new AnnotPath(std::move(ac), count); } QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, const QSet<Annotation::SubType> &subtypes, int parentID) @@ -1653,11 +1653,11 @@ if (markupann) markupann->setOpacity( style.opacity() ); - AnnotBorderArray * border = new AnnotBorderArray(); + auto border = std::make_unique<AnnotBorderArray>(); border->setWidth( style.width() ); border->setHorizontalCorner( style.xCorners() ); border->setVerticalCorner( style.yCorners() ); - d->pdfAnnot->setBorder(border); + d->pdfAnnot->setBorder(std::move(border)); } Annotation::Popup Annotation::popup() const @@ -2721,17 +2721,17 @@ return; } - AnnotColor * c = convertQColor(color); + auto c = convertQColor(color); if (d->pdfAnnot->getType() == Annot::typeLine) { AnnotLine *lineann = static_cast<AnnotLine*>(d->pdfAnnot); - lineann->setInteriorColor(c); + lineann->setInteriorColor(std::move(c)); } else { AnnotPolygon *polyann = static_cast<AnnotPolygon*>(d->pdfAnnot); - polyann->setInteriorColor(c); + polyann->setInteriorColor(std::move(c)); } } @@ -5077,12 +5077,12 @@ return newcolor; } -AnnotColor* convertQColor( const QColor &c ) +std::unique_ptr<AnnotColor> convertQColor( const QColor &c ) { if (!c.isValid() || c.alpha() == 0) - return new AnnotColor(); // Transparent + return std::make_unique<AnnotColor>(); // Transparent else - return new AnnotColor(c.redF(), c.greenF(), c.blueF()); + return std::make_unique<AnnotColor>(c.redF(), c.greenF(), c.blueF()); } //END utility annotation functions
diff --git a/qt5/src/poppler-annotation-helper.h b/qt5/src/poppler-annotation-helper.h index 3150569..8419b0b 100644 --- a/qt5/src/poppler-annotation-helper.h +++ b/qt5/src/poppler-annotation-helper.h
@@ -176,6 +176,6 @@ } QColor convertAnnotColor( AnnotColor *color ); -AnnotColor* convertQColor( const QColor &color ); +std::unique_ptr<AnnotColor> convertQColor( const QColor &color ); }
diff --git a/qt5/src/poppler-annotation.cc b/qt5/src/poppler-annotation.cc index dfd5690..459689a 100644 --- a/qt5/src/poppler-annotation.cc +++ b/qt5/src/poppler-annotation.cc
@@ -350,7 +350,7 @@ AnnotPath * AnnotationPrivate::toAnnotPath(const QLinkedList<QPointF> &list) const { const int count = list.size(); - AnnotCoord **ac = (AnnotCoord **) gmallocn(count, sizeof(AnnotCoord*)); + auto ac = std::make_unique<AnnotCoord[]>(count); double MTX[6]; fillTransformationMTX(MTX); @@ -360,10 +360,10 @@ { double x, y; XPDFReader::invTransform( MTX, p, x, y ); - ac[pos++] = new AnnotCoord(x, y); + ac[pos++] = AnnotCoord(x, y); } - return new AnnotPath(ac, count); + return new AnnotPath(std::move(ac), count); } QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, const QSet<Annotation::SubType> &subtypes, int parentID) @@ -1650,11 +1650,11 @@ if (markupann) markupann->setOpacity( style.opacity() ); - AnnotBorderArray * border = new AnnotBorderArray(); + auto border = std::make_unique<AnnotBorderArray>(); border->setWidth( style.width() ); border->setHorizontalCorner( style.xCorners() ); border->setVerticalCorner( style.yCorners() ); - d->pdfAnnot->setBorder(border); + d->pdfAnnot->setBorder(std::move(border)); } Annotation::Popup Annotation::popup() const @@ -2708,17 +2708,17 @@ return; } - AnnotColor * c = convertQColor(color); + auto c = convertQColor(color); if (d->pdfAnnot->getType() == Annot::typeLine) { AnnotLine *lineann = static_cast<AnnotLine*>(d->pdfAnnot); - lineann->setInteriorColor(c); + lineann->setInteriorColor(std::move(c)); } else { AnnotPolygon *polyann = static_cast<AnnotPolygon*>(d->pdfAnnot); - polyann->setInteriorColor(c); + polyann->setInteriorColor(std::move(c)); } } @@ -5065,12 +5065,12 @@ return newcolor; } -AnnotColor* convertQColor( const QColor &c ) +std::unique_ptr<AnnotColor> convertQColor( const QColor &c ) { if (!c.isValid() || c.alpha() == 0) - return new AnnotColor(); // Transparent + return std::make_unique<AnnotColor>(); // Transparent else - return new AnnotColor(c.redF(), c.greenF(), c.blueF()); + return std::make_unique<AnnotColor>(c.redF(), c.greenF(), c.blueF()); } //END utility annotation functions