Merge remote-tracking branch 'origin/master' into better_object
diff --git a/cpp/poppler-document.cpp b/cpp/poppler-document.cpp
index 998a836..e63d45a 100644
--- a/cpp/poppler-document.cpp
+++ b/cpp/poppler-document.cpp
@@ -86,10 +86,8 @@
, raw_doc_data_length(0)
, is_locked(false)
{
- Object obj;
- obj.initNull();
file_data->swap(doc_data);
- MemStream *memstr = new MemStream(&doc_data[0], 0, doc_data.size(), &obj);
+ MemStream *memstr = new MemStream(&doc_data[0], 0, doc_data.size(), Object(objNull));
GooString goo_owner_password(owner_password.c_str());
GooString goo_user_password(user_password.c_str());
doc = new PDFDoc(memstr, &goo_owner_password, &goo_user_password);
@@ -104,9 +102,7 @@
, raw_doc_data_length(file_data_length)
, is_locked(false)
{
- Object obj;
- obj.initNull();
- MemStream *memstr = new MemStream(const_cast<char *>(raw_doc_data), 0, raw_doc_data_length, &obj);
+ MemStream *memstr = new MemStream(const_cast<char *>(raw_doc_data), 0, raw_doc_data_length, Object(objNull));
GooString goo_owner_password(owner_password.c_str());
GooString goo_user_password(user_password.c_str());
doc = new PDFDoc(memstr, &goo_owner_password, &goo_user_password);
@@ -315,9 +311,8 @@
return std::vector<std::string>();
}
- Object info;
- if (!d->doc->getDocInfo(&info)->isDict()) {
- info.free();
+ Object info = d->doc->getDocInfo();
+ if (!info.isDict()) {
return std::vector<std::string>();
}
@@ -327,7 +322,6 @@
keys[i] = std::string(info_dict->getKey(i));
}
- info.free();
return keys;
}
diff --git a/cpp/poppler-page.cpp b/cpp/poppler-page.cpp
index b8927b8..a3f8506 100644
--- a/cpp/poppler-page.cpp
+++ b/cpp/poppler-page.cpp
@@ -172,11 +172,10 @@
page_transition* page::transition() const
{
if (!d->transition) {
- Object o;
- if (d->page->getTrans(&o)->isDict()) {
+ Object o = d->page->getTrans();
+ if (o.isDict()) {
d->transition = new page_transition(&o);
}
- o.free();
}
return d->transition;
}
diff --git a/fofi/FoFiType1.cc b/fofi/FoFiType1.cc
index 8974cc9..f741d5d 100644
--- a/fofi/FoFiType1.cc
+++ b/fofi/FoFiType1.cc
@@ -302,6 +302,7 @@
if (code >= 0 && code < 256) {
c = *p2;
*p2 = '\0';
+ gfree(encoding[code]);
encoding[code] = copyString(p);
*p2 = c;
}
diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc
index 809fa58..ad8ed18 100644
--- a/glib/poppler-action.cc
+++ b/glib/poppler-action.cc
@@ -431,9 +431,8 @@
if (link->hasAnnotRef ()) {
Ref *ref = link->getAnnotRef ();
- xref->fetch (ref->num, ref->gen, &annotObj);
+ annotObj = xref->fetch (ref->num, ref->gen);
} else if (link->hasAnnotTitle ()) {
- Object annots;
GooString *title = link->getAnnotTitle ();
int i;
@@ -441,52 +440,48 @@
Page *p = document->doc->getPage (i);
if (!p) continue;
- if (p->getAnnots (&annots)->isArray ()) {
+ Object annots = p->getAnnotsObject ();
+ if (annots.isArray ()) {
int j;
GBool found = gFalse;
for (j = 0; j < annots.arrayGetLength () && !found; ++j) {
- if (annots.arrayGet(j, &annotObj)->isDict()) {
- Object obj1;
-
- if (!annotObj.dictLookup ("Subtype", &obj1)->isName ("Movie")) {
- obj1.free ();
+ annotObj = annots.arrayGet(j);
+ if (annotObj.isDict()) {
+ Object obj1 = annotObj.dictLookup ("Subtype");
+ if (!obj1.isName ("Movie")) {
continue;
}
- obj1.free ();
- if (annotObj.dictLookup ("T", &obj1)->isString()) {
+ obj1 = annotObj.dictLookup ("T");
+ if (obj1.isString()) {
GooString *t = obj1.getString ();
if (title->cmp(t) == 0)
found = gTrue;
}
- obj1.free ();
}
if (!found)
- annotObj.free ();
+ annotObj.setToNull ();
}
if (found) {
- annots.free ();
break;
} else {
- annotObj.free ();
+ annotObj.setToNull ();
}
}
- annots.free ();
}
}
if (annotObj.isDict ()) {
Object tmp;
- annot = new AnnotMovie (document->doc, annotObj.getDict(), &tmp);
+ annot = new AnnotMovie (document->doc, &annotObj, &tmp);
if (!annot->isOk ()) {
delete annot;
annot = NULL;
}
}
- annotObj.free ();
return annot;
}
diff --git a/glib/poppler-attachment.cc b/glib/poppler-attachment.cc
index 874bffb..5d84595 100644
--- a/glib/poppler-attachment.cc
+++ b/glib/poppler-attachment.cc
@@ -35,7 +35,7 @@
typedef struct _PopplerAttachmentPrivate PopplerAttachmentPrivate;
struct _PopplerAttachmentPrivate
{
- Object *obj_stream;
+ Object obj_stream;
};
#define POPPLER_ATTACHMENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), POPPLER_TYPE_ATTACHMENT, PopplerAttachmentPrivate))
@@ -64,13 +64,7 @@
PopplerAttachmentPrivate *priv;
priv = POPPLER_ATTACHMENT_GET_PRIVATE (obj);
-
- if (priv->obj_stream)
- {
- priv->obj_stream->free();
- delete priv->obj_stream;
- priv->obj_stream = NULL;
- }
+ priv->obj_stream = Object();
G_OBJECT_CLASS (poppler_attachment_parent_class)->dispose (obj);
}
@@ -127,10 +121,7 @@
if (embFile->checksum () && embFile->checksum ()->getLength () > 0)
attachment->checksum = g_string_new_len (embFile->checksum ()->getCString (),
embFile->checksum ()->getLength ());
- priv->obj_stream = new Object();
- priv->obj_stream->initStream(embFile->stream());
- // Copy the stream
- embFile->stream()->incRef();
+ priv->obj_stream = embFile->streamObject()->copy();
return attachment;
}
@@ -243,7 +234,7 @@
g_return_val_if_fail (POPPLER_IS_ATTACHMENT (attachment), FALSE);
- stream = POPPLER_ATTACHMENT_GET_PRIVATE (attachment)->obj_stream->getStream();
+ stream = POPPLER_ATTACHMENT_GET_PRIVATE (attachment)->obj_stream.getStream();
stream->reset();
do
diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc
index 334f9b6..157a048 100644
--- a/glib/poppler-document.cc
+++ b/glib/poppler-document.cc
@@ -230,7 +230,6 @@
const char *password,
GError **error)
{
- Object obj;
PDFDoc *newDoc;
MemStream *str;
GooString *password_g;
@@ -240,8 +239,7 @@
}
// create stream
- obj.initNull();
- str = new MemStream(data, 0, length, &obj);
+ str = new MemStream(data, 0, length, Object(objNull));
password_g = poppler_password_to_latin1(password);
newDoc = new PDFDoc(str, password_g, password_g);
@@ -282,7 +280,6 @@
GCancellable *cancellable,
GError **error)
{
- Object obj;
PDFDoc *newDoc;
BaseStream *str;
GooString *password_g;
@@ -300,12 +297,11 @@
return NULL;
}
- obj.initNull();
if (stream_is_memory_buffer_or_local_file(stream)) {
- str = new PopplerInputStream(stream, cancellable, 0, gFalse, 0, &obj);
+ str = new PopplerInputStream(stream, cancellable, 0, gFalse, 0, Object(objNull));
} else {
CachedFile *cachedFile = new CachedFile(new PopplerCachedFileLoader(stream, cancellable, length), new GooString());
- str = new CachedFileStream(cachedFile, 0, gFalse, cachedFile->getLength(), &obj);
+ str = new CachedFileStream(cachedFile, 0, gFalse, cachedFile->getLength(), Object(objNull));
}
password_g = poppler_password_to_latin1(password);
@@ -2410,32 +2406,26 @@
int i, j;
for (i = 0; i < rb->getLength (); ++i) {
- Object obj;
Array *rb_array;
GList *group = NULL;
- rb->get (i, &obj);
+ Object obj = rb->get (i);
if (!obj.isArray ()) {
- obj.free ();
continue;
}
rb_array = obj.getArray ();
for (j = 0; j < rb_array->getLength (); ++j) {
- Object ref;
OptionalContentGroup *oc;
- rb_array->getNF (j, &ref);
+ Object ref = rb_array->getNF (j);
if (!ref.isRef ()) {
- ref.free ();
continue;
}
oc = ocg->findOcgByRef (ref.getRef ());
group = g_list_prepend (group, oc);
- ref.free ();
}
- obj.free ();
groups = g_list_prepend (groups, group);
}
@@ -2468,14 +2458,10 @@
int i;
for (i = 0; i < order->getLength (); ++i) {
- Object orderItem;
-
- order->get (i, &orderItem);
+ Object orderItem = order->get (i);
if (orderItem.isDict ()) {
- Object ref;
-
- order->getNF (i, &ref);
+ Object ref = order->getNF (i);
if (ref.isRef ()) {
OptionalContentGroup *oc = ocg->findOcgByRef (ref.getRef ());
Layer *layer = layer_new (oc);
@@ -2483,7 +2469,6 @@
items = g_list_prepend (items, layer);
last_item = layer;
}
- ref.free ();
} else if (orderItem.isArray () && orderItem.arrayGetLength () > 0) {
if (!last_item) {
last_item = layer_new (NULL);
@@ -2494,7 +2479,6 @@
} else if (orderItem.isString ()) {
last_item->label = _poppler_goo_string_to_utf8 (orderItem.getString ());
}
- orderItem.free ();
}
return g_list_reverse (items);
diff --git a/glib/poppler-input-stream.cc b/glib/poppler-input-stream.cc
index e57e344..cf7a504 100644
--- a/glib/poppler-input-stream.cc
+++ b/glib/poppler-input-stream.cc
@@ -21,8 +21,8 @@
#include "poppler-input-stream.h"
PopplerInputStream::PopplerInputStream(GInputStream *inputStreamA, GCancellable *cancellableA,
- Goffset startA, GBool limitedA, Goffset lengthA, Object *dictA)
- : BaseStream(dictA, lengthA)
+ Goffset startA, GBool limitedA, Goffset lengthA, Object &&dictA)
+ : BaseStream(std::move(dictA), lengthA)
{
inputStream = (GInputStream *)g_object_ref(inputStreamA);
cancellable = cancellableA ? (GCancellable *)g_object_ref(cancellableA) : NULL;
@@ -44,13 +44,13 @@
}
BaseStream *PopplerInputStream::copy() {
- return new PopplerInputStream(inputStream, cancellable, start, limited, length, &dict);
+ return new PopplerInputStream(inputStream, cancellable, start, limited, length, dict.copy());
}
Stream *PopplerInputStream::makeSubStream(Goffset startA, GBool limitedA,
- Goffset lengthA, Object *dictA)
+ Goffset lengthA, Object &&dictA)
{
- return new PopplerInputStream(inputStream, cancellable, startA, limitedA, lengthA, dictA);
+ return new PopplerInputStream(inputStream, cancellable, startA, limitedA, lengthA, std::move(dictA));
}
void PopplerInputStream::reset()
diff --git a/glib/poppler-input-stream.h b/glib/poppler-input-stream.h
index 39bbe01..536487a 100644
--- a/glib/poppler-input-stream.h
+++ b/glib/poppler-input-stream.h
@@ -31,11 +31,11 @@
public:
PopplerInputStream(GInputStream *inputStream, GCancellable *cancellableA,
- Goffset startA, GBool limitedA, Goffset lengthA, Object *dictA);
+ Goffset startA, GBool limitedA, Goffset lengthA, Object &&dictA);
~PopplerInputStream();
BaseStream *copy() override;
Stream *makeSubStream(Goffset start, GBool limited,
- Goffset lengthA, Object *dictA) override;
+ Goffset lengthA, Object &&dictA) override;
StreamKind getKind() override { return strWeird; }
void reset() override;
void close() override;
diff --git a/glib/poppler-media.cc b/glib/poppler-media.cc
index 5712371..8634af4 100644
--- a/glib/poppler-media.cc
+++ b/glib/poppler-media.cc
@@ -40,7 +40,7 @@
gchar *filename;
gchar *mime_type;
- Stream *stream;
+ Object stream;
};
struct _PopplerMediaClass
@@ -65,10 +65,7 @@
media->mime_type = NULL;
}
- if (media->stream) {
- media->stream->decRef();
- media->stream = NULL;
- }
+ media->stream = Object();
G_OBJECT_CLASS (poppler_media_parent_class)->finalize (object);
}
@@ -98,7 +95,7 @@
if (poppler_media->getIsEmbedded()) {
GooString* mime_type;
- media->stream = poppler_media->getEmbbededStream();
+ media->stream = poppler_media->getEmbbededStreamObject()->copy();
mime_type = poppler_media->getContentType();
if (mime_type)
media->mime_type = g_strdup (mime_type->getCString());
@@ -124,7 +121,7 @@
poppler_media_get_filename (PopplerMedia *poppler_media)
{
g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), NULL);
- g_return_val_if_fail (poppler_media->stream == NULL, NULL);
+ g_return_val_if_fail (!poppler_media->stream.isStream(), NULL);
return poppler_media->filename;
}
@@ -147,7 +144,7 @@
{
g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), FALSE);
- return poppler_media->stream != NULL;
+ return poppler_media->stream.isStream();
}
/**
@@ -215,7 +212,7 @@
FILE *f;
g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), FALSE);
- g_return_val_if_fail (poppler_media->stream != NULL, FALSE);
+ g_return_val_if_fail (poppler_media->stream.isStream(), FALSE);
f = g_fopen (filename, "wb");
@@ -281,9 +278,9 @@
gboolean eof_reached = FALSE;
g_return_val_if_fail (POPPLER_IS_MEDIA (poppler_media), FALSE);
- g_return_val_if_fail (poppler_media->stream != NULL, FALSE);
+ g_return_val_if_fail (poppler_media->stream.isStream(), FALSE);
- stream = poppler_media->stream;
+ stream = poppler_media->stream.getStream();
stream->reset();
do
diff --git a/glib/poppler-movie.cc b/glib/poppler-movie.cc
index 791cda7..1e82af7 100644
--- a/glib/poppler-movie.cc
+++ b/glib/poppler-movie.cc
@@ -84,11 +84,8 @@
movie->filename = g_strdup (poppler_movie->getFileName()->getCString());
if (poppler_movie->getShowPoster()) {
- Object tmp;
-
- poppler_movie->getPoster(&tmp);
+ Object tmp = poppler_movie->getPoster();
movie->need_poster = (!tmp.isRef() && !tmp.isStream());
- tmp.free();
}
movie->show_controls = poppler_movie->getActivationParameters()->showControls;
diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc
index 3d63bfd..a44edac 100644
--- a/glib/poppler-page.cc
+++ b/glib/poppler-page.cc
@@ -184,12 +184,11 @@
{
PageTransition *trans;
PopplerPageTransition *transition;
- Object obj;
-
+
g_return_val_if_fail (POPPLER_IS_PAGE (page), NULL);
- trans = new PageTransition (page->page->getTrans (&obj));
- obj.free ();
+ Object obj = page->page->getTrans ();
+ trans = new PageTransition (&obj);
if (!trans->isOk ()) {
delete trans;
@@ -588,7 +587,6 @@
int *width,
int *height)
{
- Object thumb;
Dict *dict;
gboolean retval = FALSE;
@@ -596,10 +594,9 @@
g_return_val_if_fail (width != NULL, FALSE);
g_return_val_if_fail (height != NULL, FALSE);
- page->page->getThumb (&thumb);
+ Object thumb = page->page->getThumb ();
if (!thumb.isStream ())
{
- thumb.free ();
return FALSE;
}
@@ -611,8 +608,6 @@
dict->lookupInt ("Height", "H", height))
retval = TRUE;
- thumb.free ();
-
return retval;
}
diff --git a/glib/poppler-structure-element.cc b/glib/poppler-structure-element.cc
index c626999..70dfd50 100644
--- a/glib/poppler-structure-element.cc
+++ b/glib/poppler-structure-element.cc
@@ -1213,9 +1213,8 @@
g_assert (object->arrayGetLength () == 4);
for (guint i = 0; i < 4; i++)
{
- Object item;
- values[i] = name_to_enum<PopplerStructureBorderStyle> (object->arrayGet (i, &item));
- item.free ();
+ Object item = object->arrayGet (i);
+ values[i] = name_to_enum<PopplerStructureBorderStyle> (&item);
}
}
else
@@ -1261,9 +1260,7 @@
for (guint i = 0; i < *n_values; i++)
{
- Object item;
- doubles[i] = object->arrayGet (i, &item)->getNum ();
- item.free ();
+ doubles[i] = object->arrayGet (i).getNum ();
}
}
@@ -1273,16 +1270,9 @@
g_assert (color != NULL);
g_assert (object->isArray () && object->arrayGetLength () != 3);
- Object item;
-
- color->red = object->arrayGet (0, &item)->getNum () * 65535;
- item.free ();
-
- color->green = object->arrayGet (1, &item)->getNum () * 65535;
- item.free ();
-
- color->blue = object->arrayGet (2, &item)->getNum () * 65535;
- item.free ();
+ color->red = object->arrayGet (0).getNum () * 65535;
+ color->green = object->arrayGet (1).getNum () * 65535;
+ color->blue = object->arrayGet (2).getNum () * 65535;
}
/**
@@ -1377,9 +1367,8 @@
// One color per side.
for (guint i = 0; i < 4; i++)
{
- Object item;
- convert_color (value->arrayGet (i, &item), &colors[i]);
- item.free ();
+ Object item = value->arrayGet (i);
+ convert_color (&item, &colors[i]);
}
}
else
@@ -1403,9 +1392,7 @@
g_assert (object->arrayGetLength () == 4);
for (guint i = 0; i < 4; i++)
{
- Object item;
- value[i] = object->arrayGet (i, &item)->getNum ();
- item.free ();
+ value[i] = object->arrayGet (i).getNum ();
}
}
else
@@ -2175,16 +2162,14 @@
for (guint i = 0; i < n_values; i++)
{
- Object item;
+ Object item = value->arrayGet (i);
- if (value->arrayGet (i, &item)->isString ())
+ if (item.isString ())
result[i] = _poppler_goo_string_to_utf8 (item.getString ());
else if (item.isName ())
result[i] = g_strdup (item.getName ());
else
g_assert_not_reached ();
-
- item.free ();
}
return result;
diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index 974b098..bda5a90 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -166,10 +166,10 @@
}
static AnnotExternalDataType parseAnnotExternalData(Dict* dict) {
- Object obj1;
AnnotExternalDataType type;
- if (dict->lookup("Subtype", &obj1)->isName()) {
+ Object obj1 = dict->lookup("Subtype");
+ if (obj1.isName()) {
const char *typeName = obj1.getName();
if (!strcmp(typeName, "Markup3D")) {
@@ -180,7 +180,6 @@
} else {
type = annotExternalDataMarkupUnknown;
}
- obj1.free();
return type;
}
@@ -190,14 +189,10 @@
if (array->getLength() == 4) {
// deltas
Object obj1;
- double dx1 = (array->get(0, &obj1)->isNum() ? obj1.getNum() : 0);
- obj1.free();
- double dy1 = (array->get(1, &obj1)->isNum() ? obj1.getNum() : 0);
- obj1.free();
- double dx2 = (array->get(2, &obj1)->isNum() ? obj1.getNum() : 0);
- obj1.free();
- double dy2 = (array->get(3, &obj1)->isNum() ? obj1.getNum() : 0);
- obj1.free();
+ double dx1 = (obj1 = array->get(0), obj1.isNum() ? obj1.getNum() : 0);
+ double dy1 = (obj1 = array->get(1), obj1.isNum() ? obj1.getNum() : 0);
+ double dx2 = (obj1 = array->get(2), obj1.isNum() ? obj1.getNum() : 0);
+ double dy2 = (obj1 = array->get(3), obj1.isNum() ? obj1.getNum() : 0);
// checking that the numbers are valid (i.e. >= 0),
// and that applying the differences still give us a valid rect
@@ -215,10 +210,10 @@
}
static LinkAction* getAdditionalAction(Annot::AdditionalActionsType type, Object *additionalActions, PDFDoc *doc) {
- Object additionalActionsObject;
- LinkAction *linkAction = NULL;
+ LinkAction *linkAction = nullptr;
+ Object additionalActionsObject = additionalActions->fetch(doc->getXRef());
- if (additionalActions->fetch(doc->getXRef(), &additionalActionsObject)->isDict()) {
+ if (additionalActionsObject.isDict()) {
const char *key = (type == Annot::actionCursorEntering ? "E" :
type == Annot::actionCursorLeaving ? "X" :
type == Annot::actionMousePressed ? "D" :
@@ -230,37 +225,29 @@
type == Annot::actionPageVisible ? "PV" :
type == Annot::actionPageInvisible ? "PI" : NULL);
- Object actionObject;
-
- if (additionalActionsObject.dictLookup(key, &actionObject)->isDict())
+ Object actionObject = additionalActionsObject.dictLookup(key);
+ if (actionObject.isDict())
linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI());
- actionObject.free();
}
- additionalActionsObject.free();
-
return linkAction;
}
static LinkAction* getFormAdditionalAction(Annot::FormAdditionalActionsType type, Object *additionalActions, PDFDoc *doc) {
- Object additionalActionsObject;
- LinkAction *linkAction = NULL;
+ LinkAction *linkAction = nullptr;
+ Object additionalActionsObject = additionalActions->fetch(doc->getXRef());
- if (additionalActions->fetch(doc->getXRef(), &additionalActionsObject)->isDict()) {
+ if (additionalActionsObject.isDict()) {
const char *key = (type == Annot::actionFieldModified ? "K" :
type == Annot::actionFormatField ? "F" :
type == Annot::actionValidateField ? "V" :
type == Annot::actionCalculateField ? "C" : NULL);
- Object actionObject;
-
- if (additionalActionsObject.dictLookup(key, &actionObject)->isDict())
+ Object actionObject = additionalActionsObject.dictLookup(key);
+ if (actionObject.isDict())
linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI());
- actionObject.free();
}
- additionalActionsObject.free();
-
return linkAction;
}
@@ -271,7 +258,8 @@
AnnotBorderEffect::AnnotBorderEffect(Dict *dict) {
Object obj1;
- if (dict->lookup("S", &obj1)->isName()) {
+ obj1 = dict->lookup("S");
+ if (obj1.isName()) {
const char *effectName = obj1.getName();
if (!strcmp(effectName, "C"))
@@ -281,14 +269,13 @@
} else {
effectType = borderEffectNoEffect;
}
- obj1.free();
- if ((dict->lookup("I", &obj1)->isNum()) && effectType == borderEffectCloudy) {
+ obj1 = dict->lookup("I");
+ if (obj1.isNum() && effectType == borderEffectCloudy) {
intensity = obj1.getNum();
} else {
intensity = 0;
}
- obj1.free();
}
//------------------------------------------------------------------------
@@ -351,22 +338,21 @@
tempCoords = (AnnotCoord **) gmallocn (tempLength, sizeof(AnnotCoord *));
memset(tempCoords, 0, tempLength * sizeof(AnnotCoord *));
for (int i = 0; i < tempLength && correct; i++) {
- Object obj1;
double x = 0, y = 0;
- if (array->get(i * 2, &obj1)->isNum()) {
+ Object obj1 = array->get(i * 2);
+ if (obj1.isNum()) {
x = obj1.getNum();
} else {
correct = gFalse;
}
- obj1.free();
- if (array->get((i * 2) + 1, &obj1)->isNum()) {
+ obj1 = array->get((i * 2) + 1);
+ if (obj1.isNum()) {
y = obj1.getNum();
} else {
correct = gFalse;
}
- obj1.free();
if (!correct) {
for (int j = i - 1; j >= 0; j--)
@@ -424,16 +410,14 @@
for (i = 0; i < quadsLength; i++) {
for (int j = 0; j < 8; j++) {
- Object obj;
- if (array->get(i * 8 + j, &obj)->isNum()) {
+ Object obj = array->get(i * 8 + j);
+ if (obj.isNum()) {
quadArray[j] = obj.getNum();
} else {
correct = gFalse;
- obj.free();
error (errSyntaxError, -1, "Invalid QuadPoint in annot");
break;
}
- obj.free();
}
if (!correct)
@@ -540,13 +524,11 @@
// TODO: check not all zero (Line Dash Pattern Page 217 PDF 8.1)
for (int i = 0; i < tempLength && i < DASH_LIMIT && correct; i++) {
- Object obj1;
-
- if (dashObj->arrayGet(i, &obj1)->isNum()) {
+ Object obj1 = dashObj->arrayGet(i);
+ if (obj1.isNum()) {
tempDash[i] = obj1.getNum();
correct = tempDash[i] >= 0;
- obj1.free();
}
}
@@ -583,30 +565,30 @@
if (arrayLength == 3 || arrayLength == 4) {
// implementation note 81 in Appendix H.
- if (array->get(0, &obj1)->isNum())
+ obj1 = array->get(0);
+ if (obj1.isNum())
horizontalCorner = obj1.getNum();
else
correct = gFalse;
- obj1.free();
- if (array->get(1, &obj1)->isNum())
+ obj1 = array->get(1);
+ if (obj1.isNum())
verticalCorner = obj1.getNum();
else
correct = gFalse;
- obj1.free();
- if (array->get(2, &obj1)->isNum())
+ obj1 = array->get(2);
+ if (obj1.isNum())
width = obj1.getNum();
else
correct = gFalse;
- obj1.free();
if (arrayLength == 4) {
- if (array->get(3, &obj1)->isArray())
+ obj1 = array->get(3);
+ if (obj1.isArray())
correct = parseDashArray(&obj1);
else
correct = gFalse;
- obj1.free();
}
} else {
correct = gFalse;
@@ -617,21 +599,22 @@
}
}
-void AnnotBorderArray::writeToObject(XRef *xref, Object *obj1) const {
- Object obj2;
-
- obj1->initArray(xref);
- obj1->arrayAdd(obj2.initReal(horizontalCorner));
- obj1->arrayAdd(obj2.initReal(verticalCorner));
- obj1->arrayAdd(obj2.initReal(width));
+Object AnnotBorderArray::writeToObject(XRef *xref) const {
+ Array *borderArray = new Array(xref);
+ borderArray->add(Object(horizontalCorner));
+ borderArray->add(Object(verticalCorner));
+ borderArray->add(Object(width));
if (dashLength > 0) {
- Object obj3;
+ Array *a = new Array(xref);
- obj1->arrayAdd(obj3.initArray(xref));
for (int i = 0; i < dashLength; i++)
- obj3.arrayAdd(obj2.initReal(dash[i]));
+ a->add(Object(dash[i]));
+
+ borderArray->add(Object(a));
}
+
+ return Object(borderArray);
}
//------------------------------------------------------------------------
@@ -650,8 +633,8 @@
// that behaviour by veryifying both entries exist
// otherwise we set the borderWidth to 0
// --jrmuizel
- dict->lookup("W", &obj1);
- dict->lookup("S", &obj2);
+ obj1 = dict->lookup("W");
+ obj2 = dict->lookup("S");
if (obj1.isNum() && obj2.isName()) {
const char *styleName = obj2.getName();
@@ -673,13 +656,11 @@
} else {
width = 0;
}
- obj2.free();
- obj1.free();
if (style == borderDashed) {
- if (dict->lookup("D", &obj1)->isArray())
+ obj1 = dict->lookup("D");
+ if (obj1.isArray())
parseDashArray(&obj1);
- obj1.free();
if (!dash) {
dashLength = 1;
@@ -706,19 +687,18 @@
return "S";
}
-void AnnotBorderBS::writeToObject(XRef *xref, Object *obj1) const {
- Object obj2;
-
- obj1->initDict(xref);
- obj1->dictSet("W", obj2.initReal(width));
- obj1->dictSet("S", obj2.initName(getStyleName()));
+Object AnnotBorderBS::writeToObject(XRef *xref) const {
+ Dict *dict = new Dict(xref);
+ dict->set("W", Object(width));
+ dict->set("S", Object(objName, getStyleName()));
if (style == borderDashed && dashLength > 0) {
- Object obj3;
+ Array *a = new Array(xref);
- obj1->dictSet("D", obj3.initArray(xref));
for (int i = 0; i < dashLength; i++)
- obj3.arrayAdd(obj2.initReal(dash[i]));
+ a->add(Object(dash[i]));
+ dict->set("D", Object(a));
}
+ return Object(dict);
}
//------------------------------------------------------------------------
@@ -763,9 +743,8 @@
length = 4;
for (i = 0; i < length; i++) {
- Object obj1;
-
- if (array->get(i, &obj1)->isNum()) {
+ Object obj1 = array->get(i);
+ if (obj1.isNum()) {
values[i] = obj1.getNum();
if (values[i] < 0 || values[i] > 1)
@@ -773,7 +752,6 @@
} else {
values[i] = 0;
}
- obj1.free();
}
if (adjust != 0)
@@ -797,16 +775,14 @@
}
}
-void AnnotColor::writeToObject(XRef *xref, Object *obj1) const {
- Object obj2;
- int i;
-
+Object AnnotColor::writeToObject(XRef *xref) const {
if (length == 0) {
- obj1->initNull(); // Transparent (no color)
+ return Object(objNull); // Transparent (no color)
} else {
- obj1->initArray(xref);
- for (i = 0; i < length; ++i)
- obj1->arrayAdd( obj2.initReal( values[i] ) );
+ Array *a = new Array(xref);
+ for (int i = 0; i < length; ++i)
+ a->add( Object( values[i] ) );
+ return Object(a);
}
}
@@ -817,7 +793,8 @@
AnnotIconFit::AnnotIconFit(Dict* dict) {
Object obj1;
- if (dict->lookup("SW", &obj1)->isName()) {
+ obj1 = dict->lookup("SW");
+ if (obj1.isName()) {
const char *scaleName = obj1.getName();
if(!strcmp(scaleName, "B")) {
@@ -832,9 +809,9 @@
} else {
scaleWhen = scaleAlways;
}
- obj1.free();
- if (dict->lookup("S", &obj1)->isName()) {
+ obj1 = dict->lookup("S");
+ if (obj1.isName()) {
const char *scaleName = obj1.getName();
if(!strcmp(scaleName, "A")) {
@@ -845,14 +822,12 @@
} else {
scale = scaleProportional;
}
- obj1.free();
- if (dict->lookup("A", &obj1)->isArray() && obj1.arrayGetLength() == 2) {
+ obj1 = dict->lookup("A");
+ if (obj1.isArray() && obj1.arrayGetLength() == 2) {
Object obj2;
- (obj1.arrayGet(0, &obj2)->isNum() ? left = obj2.getNum() : left = 0);
- obj2.free();
- (obj1.arrayGet(1, &obj2)->isNum() ? bottom = obj2.getNum() : bottom = 0);
- obj2.free();
+ (obj2 = obj1.arrayGet(0), obj2.isNum() ? left = obj2.getNum() : left = 0);
+ (obj2 = obj1.arrayGet(1), obj2.isNum() ? bottom = obj2.getNum() : bottom = 0);
if (left < 0 || left > 1)
left = 0.5;
@@ -863,14 +838,13 @@
} else {
left = bottom = 0.5;
}
- obj1.free();
- if (dict->lookup("FB", &obj1)->isBool()) {
+ obj1 = dict->lookup("FB");
+ if (obj1.isBool()) {
fullyBounds = obj1.getBool();
} else {
fullyBounds = gFalse;
}
- obj1.free();
}
//------------------------------------------------------------------------
@@ -881,55 +855,54 @@
assert(dict->isDict());
doc = docA;
xref = docA->getXRef();
- dict->copy(&appearDict);
+ appearDict = dict->copy();
}
AnnotAppearance::~AnnotAppearance() {
- appearDict.free();
}
-void AnnotAppearance::getAppearanceStream(AnnotAppearanceType type, const char *state, Object *dest) {
- Object apData, stream;
- apData.initNull();
+Object AnnotAppearance::getAppearanceStream(AnnotAppearanceType type, const char *state) {
+ Object apData;
// Obtain dictionary or stream associated to appearance type
switch (type) {
case appearRollover:
- if (appearDict.dictLookupNF("R", &apData)->isNull())
- appearDict.dictLookupNF("N", &apData);
+ apData = appearDict.dictLookupNF("R");
+ if (apData.isNull())
+ apData = appearDict.dictLookupNF("N");
break;
case appearDown:
- if (appearDict.dictLookupNF("D", &apData)->isNull())
- appearDict.dictLookupNF("N", &apData);
+ apData = appearDict.dictLookupNF("D");
+ if (apData.isNull())
+ apData = appearDict.dictLookupNF("N");
break;
case appearNormal:
- appearDict.dictLookupNF("N", &apData);
+ apData = appearDict.dictLookupNF("N");
break;
}
- dest->initNull();
+ Object res;
if (apData.isDict() && state)
- apData.dictLookupNF(state, dest);
+ res = apData.dictLookupNF(state);
else if (apData.isRef())
- apData.copy(dest);
- apData.free();
+ res = apData.copy();
+
+ return res;
}
GooString * AnnotAppearance::getStateKey(int i) {
- Object obj1;
GooString * res = NULL;
- if (appearDict.dictLookupNF("N", &obj1)->isDict())
+ Object obj1 = appearDict.dictLookupNF("N");
+ if (obj1.isDict())
res = new GooString(obj1.dictGetKey(i));
- obj1.free();
return res;
}
int AnnotAppearance::getNumStates() {
- Object obj1;
int res = 0;
- if (appearDict.dictLookupNF("N", &obj1)->isDict())
+ Object obj1 = appearDict.dictLookupNF("N");
+ if (obj1.isDict())
res = obj1.dictGetLength();
- obj1.free();
return res;
}
@@ -943,15 +916,13 @@
} else if (stateObj->isDict()) { // Test each value
const int size = stateObj->dictGetLength();
for (int i = 0; i < size; ++i) {
- Object obj1;
- stateObj->dictGetValNF(i, &obj1);
+ Object obj1 = stateObj->dictGetValNF(i);
if (obj1.isRef()) {
Ref r = obj1.getRef();
if (r.num == refToStream.num && r.gen == refToStream.gen) {
return gTrue;
}
}
- obj1.free();
}
}
return gFalse; // Not found
@@ -963,21 +934,18 @@
GBool found;
// Scan each state's ref/subdictionary
- appearDict.dictLookupNF("N", &obj1);
+ obj1 = appearDict.dictLookupNF("N");
found = referencesStream(&obj1, refToStream);
- obj1.free();
if (found)
return gTrue;
- appearDict.dictLookupNF("R", &obj1);
+ obj1 = appearDict.dictLookupNF("R");
found = referencesStream(&obj1, refToStream);
- obj1.free();
if (found)
return gTrue;
- appearDict.dictLookupNF("D", &obj1);
+ obj1 = appearDict.dictLookupNF("D");
found = referencesStream(&obj1, refToStream);
- obj1.free();
return found;
}
@@ -1011,27 +979,22 @@
} else if (obj1->isDict()) {
const int size = obj1->dictGetLength();
for (int i = 0; i < size; ++i) {
- Object obj2;
- obj1->dictGetValNF(i, &obj2);
+ Object obj2 = obj1->dictGetValNF(i);
if (obj2.isRef()) {
removeStream(obj2.getRef());
}
- obj2.free();
}
}
}
void AnnotAppearance::removeAllStreams() {
Object obj1;
- appearDict.dictLookupNF("N", &obj1);
+ obj1 = appearDict.dictLookupNF("N");
removeStateStreams(&obj1);
- obj1.free();
- appearDict.dictLookupNF("R", &obj1);
+ obj1 = appearDict.dictLookupNF("R");
removeStateStreams(&obj1);
- obj1.free();
- appearDict.dictLookupNF("D", &obj1);
+ obj1 = appearDict.dictLookupNF("D");
removeStateStreams(&obj1);
- obj1.free();
}
//------------------------------------------------------------------------
@@ -1041,14 +1004,15 @@
AnnotAppearanceCharacs::AnnotAppearanceCharacs(Dict *dict) {
Object obj1;
- if (dict->lookup("R", &obj1)->isInt()) {
+ obj1 = dict->lookup("R");
+ if (obj1.isInt()) {
rotation = obj1.getInt();
} else {
rotation = 0;
}
- obj1.free();
- if (dict->lookup("BC", &obj1)->isArray()) {
+ obj1 = dict->lookup("BC");
+ if (obj1.isArray()) {
Array *colorComponents = obj1.getArray();
if (colorComponents->getLength() > 0) {
borderColor = new AnnotColor(colorComponents);
@@ -1058,9 +1022,9 @@
} else {
borderColor = NULL;
}
- obj1.free();
- if (dict->lookup("BG", &obj1)->isArray()) {
+ obj1 = dict->lookup("BG");
+ if (obj1.isArray()) {
Array *colorComponents = obj1.getArray();
if (colorComponents->getLength() > 0) {
backColor = new AnnotColor(colorComponents);
@@ -1070,42 +1034,41 @@
} else {
backColor = NULL;
}
- obj1.free();
- if (dict->lookup("CA", &obj1)->isString()) {
+ obj1 = dict->lookup("CA");
+ if (obj1.isString()) {
normalCaption = new GooString(obj1.getString());
} else {
normalCaption = NULL;
}
- obj1.free();
- if (dict->lookup("RC", &obj1)->isString()) {
+ obj1 = dict->lookup("RC");
+ if (obj1.isString()) {
rolloverCaption = new GooString(obj1.getString());
} else {
rolloverCaption = NULL;
}
- obj1.free();
- if (dict->lookup("AC", &obj1)->isString()) {
+ obj1 = dict->lookup("AC");
+ if (obj1.isString()) {
alternateCaption = new GooString(obj1.getString());
} else {
alternateCaption = NULL;
}
- obj1.free();
- if (dict->lookup("IF", &obj1)->isDict()) {
+ obj1 = dict->lookup("IF");
+ if (obj1.isDict()) {
iconFit = new AnnotIconFit(obj1.getDict());
} else {
iconFit = NULL;
}
- obj1.free();
- if (dict->lookup("TP", &obj1)->isInt()) {
+ obj1 = dict->lookup("TP");
+ if (obj1.isInt()) {
position = (AnnotAppearanceCharacsTextPos) obj1.getInt();
} else {
position = captionNoIcon;
}
- obj1.free();
}
AnnotAppearanceCharacs::~AnnotAppearanceCharacs() {
@@ -1185,40 +1148,36 @@
//------------------------------------------------------------------------
Annot::Annot(PDFDoc *docA, PDFRectangle *rectA) {
- Object obj1;
refCnt = 1;
flags = flagUnknown;
type = typeUnknown;
- obj1.initArray (docA->getXRef());
- Object obj2;
- obj1.arrayAdd (obj2.initReal (rectA->x1));
- obj1.arrayAdd (obj2.initReal (rectA->y1));
- obj1.arrayAdd (obj2.initReal (rectA->x2));
- obj1.arrayAdd (obj2.initReal (rectA->y2));
- obj2.free ();
+ Array *a = new Array(docA->getXRef());
+ a->add(Object(rectA->x1));
+ a->add(Object(rectA->y1));
+ a->add(Object(rectA->x2));
+ a->add(Object(rectA->y2));
- annotObj.initDict (docA->getXRef());
- annotObj.dictSet ("Type", obj2.initName ("Annot"));
- annotObj.dictSet ("Rect", &obj1);
- // obj1 is owned by the dict
+ annotObj = Object(new Dict(docA->getXRef()));
+ annotObj.dictSet ("Type", Object(objName, "Annot"));
+ annotObj.dictSet ("Rect", Object(a));
ref = docA->getXRef()->addIndirectObject (&annotObj);
initialize (docA, annotObj.getDict());
}
-Annot::Annot(PDFDoc *docA, Dict *dict) {
+Annot::Annot(PDFDoc *docA, Object *dictObject) {
refCnt = 1;
hasRef = false;
flags = flagUnknown;
type = typeUnknown;
- annotObj.initDict (dict);
- initialize (docA, dict);
+ annotObj = dictObject->copy();
+ initialize (docA, dictObject->getDict());
}
-Annot::Annot(PDFDoc *docA, Dict *dict, Object *obj) {
+Annot::Annot(PDFDoc *docA, Object *dictObject, Object *obj) {
refCnt = 1;
if (obj->isRef()) {
hasRef = gTrue;
@@ -1228,12 +1187,12 @@
}
flags = flagUnknown;
type = typeUnknown;
- annotObj.initDict (dict);
- initialize (docA, dict);
+ annotObj = dictObject->copy();
+ initialize (docA, dictObject->getDict());
}
void Annot::initialize(PDFDoc *docA, Dict *dict) {
- Object apObj, asObj, obj1, obj2;
+ Object apObj, asObj, obj1;
ok = gTrue;
doc = docA;
@@ -1244,20 +1203,17 @@
appearBuf = NULL;
fontSize = 0;
- appearance.initNull();
+ appearance.setToNull();
//----- parse the rectangle
rect = new PDFRectangle();
- if (dict->lookup("Rect", &obj1)->isArray() && obj1.arrayGetLength() == 4) {
+ obj1 = dict->lookup("Rect");
+ if (obj1.isArray() && obj1.arrayGetLength() == 4) {
Object obj2;
- (obj1.arrayGet(0, &obj2)->isNum() ? rect->x1 = obj2.getNum() : rect->x1 = 0);
- obj2.free();
- (obj1.arrayGet(1, &obj2)->isNum() ? rect->y1 = obj2.getNum() : rect->y1 = 0);
- obj2.free();
- (obj1.arrayGet(2, &obj2)->isNum() ? rect->x2 = obj2.getNum() : rect->x2 = 1);
- obj2.free();
- (obj1.arrayGet(3, &obj2)->isNum() ? rect->y2 = obj2.getNum() : rect->y2 = 1);
- obj2.free();
+ (obj2 = obj1.arrayGet(0), obj2.isNum() ? rect->x1 = obj2.getNum() : rect->x1 = 0);
+ (obj2 = obj1.arrayGet(1), obj2.isNum() ? rect->y1 = obj2.getNum() : rect->y1 = 0);
+ (obj2 = obj1.arrayGet(2), obj2.isNum() ? rect->x2 = obj2.getNum() : rect->x2 = 1);
+ (obj2 = obj1.arrayGet(3), obj2.isNum() ? rect->y2 = obj2.getNum() : rect->y2 = 1);
if (rect->x1 > rect->x2) {
double t = rect->x1;
@@ -1276,56 +1232,54 @@
error(errSyntaxError, -1, "Bad bounding box for annotation");
ok = gFalse;
}
- obj1.free();
- if (dict->lookup("Contents", &obj1)->isString()) {
+ obj1 = dict->lookup("Contents");
+ if (obj1.isString()) {
contents = obj1.getString()->copy();
} else {
contents = new GooString();
}
- obj1.free();
// Note: This value is overwritten by Annots ctor
- if (dict->lookupNF("P", &obj1)->isRef()) {
+ obj1 = dict->lookupNF("P");
+ if (obj1.isRef()) {
Ref ref = obj1.getRef();
page = doc->getCatalog()->findPage (ref.num, ref.gen);
} else {
page = 0;
}
- obj1.free();
- if (dict->lookup("NM", &obj1)->isString()) {
+ obj1 = dict->lookup("NM");
+ if (obj1.isString()) {
name = obj1.getString()->copy();
} else {
name = NULL;
}
- obj1.free();
- if (dict->lookup("M", &obj1)->isString()) {
+ obj1 = dict->lookup("M");
+ if (obj1.isString()) {
modified = obj1.getString()->copy();
} else {
modified = NULL;
}
- obj1.free();
//----- get the flags
- if (dict->lookup("F", &obj1)->isInt()) {
+ obj1 = dict->lookup("F");
+ if (obj1.isInt()) {
flags |= obj1.getInt();
} else {
flags = flagUnknown;
}
- obj1.free();
//----- get the annotation appearance dictionary
- dict->lookup("AP", &apObj);
+ apObj = dict->lookup("AP");
if (apObj.isDict()) {
appearStreams = new AnnotAppearance(doc, &apObj);
}
- apObj.free();
//----- get the appearance state
- dict->lookup("AS", &asObj);
+ asObj = dict->lookup("AS");
if (asObj.isName()) {
appearState = new GooString(asObj.getName());
} else if (appearStreams && appearStreams->getNumStates() != 0) {
@@ -1340,11 +1294,10 @@
if (!appearState) {
appearState = new GooString("Off");
}
- asObj.free();
//----- get the annotation appearance
if (appearStreams) {
- appearStreams->getAppearanceStream(AnnotAppearance::appearNormal, appearState->getCString(), &appearance);
+ appearance = appearStreams->getAppearanceStream(AnnotAppearance::appearNormal, appearState->getCString());
}
//----- parse the border style
@@ -1352,27 +1305,27 @@
// the border shall be drawn as a solid line with a width of 1 point. But acroread
// 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.
- if (dict->lookup("Border", &obj1)->isArray())
+ obj1 = dict->lookup("Border");
+ if (obj1.isArray())
border = new AnnotBorderArray(obj1.getArray());
else
border = NULL;
- obj1.free();
- if (dict->lookup("C", &obj1)->isArray()) {
+ obj1 = dict->lookup("C");
+ if (obj1.isArray()) {
color = new AnnotColor(obj1.getArray());
} else {
color = NULL;
}
- obj1.free();
- if (dict->lookup("StructParent", &obj1)->isInt()) {
+ obj1 = dict->lookup("StructParent");
+ if (obj1.isInt()) {
treeKey = obj1.getInt();
} else {
treeKey = 0;
}
- obj1.free();
- dict->lookupNF("OC", &oc);
+ oc = dict->lookupNF("OC");
#if MULTITHREADED
gInitMutex(&mutex);
@@ -1391,8 +1344,6 @@
}
void Annot::setRect(double x1, double y1, double x2, double y2) {
- Object obj1, obj2;
-
if (x1 < x2) {
rect->x1 = x1;
rect->x2 = x2;
@@ -1409,13 +1360,13 @@
rect->y2 = y1;
}
- obj1.initArray (xref);
- obj1.arrayAdd (obj2.initReal (rect->x1));
- obj1.arrayAdd (obj2.initReal (rect->y1));
- obj1.arrayAdd (obj2.initReal (rect->x2));
- obj1.arrayAdd (obj2.initReal (rect->y2));
+ Array *a = new Array(xref);
+ a->add(Object(rect->x1));
+ a->add(Object(rect->y1));
+ a->add(Object(rect->x2));
+ a->add(Object(rect->y2));
- update("Rect", &obj1);
+ update("Rect", Object(a));
invalidateAppearance();
}
@@ -1423,19 +1374,17 @@
return rect->contains(x, y);
}
-void Annot::update(const char *key, Object *value) {
+void Annot::update(const char *key, Object &&value) {
annotLocker();
/* Set M to current time, unless we are updating M itself */
if (strcmp(key, "M") != 0) {
delete modified;
modified = timeToDateString(NULL);
- Object obj1;
- obj1.initString (modified->copy());
- annotObj.dictSet("M", &obj1);
+ annotObj.dictSet("M", Object(modified->copy()));
}
- annotObj.dictSet(const_cast<char*>(key), value);
+ annotObj.dictSet(const_cast<char*>(key), std::move(value));
xref->setModifiedObject(&annotObj, ref);
}
@@ -1455,9 +1404,7 @@
contents = new GooString();
}
- Object obj1;
- obj1.initString(contents->copy());
- update ("Contents", &obj1);
+ update ("Contents", Object(contents->copy()));
}
void Annot::setName(GooString *new_name) {
@@ -1470,9 +1417,7 @@
name = new GooString();
}
- Object obj1;
- obj1.initString(name->copy());
- update ("NM", &obj1);
+ update ("NM", Object(name->copy()));
}
void Annot::setModified(GooString *new_modified) {
@@ -1484,17 +1429,13 @@
else
modified = new GooString();
- Object obj1;
- obj1.initString(modified->copy());
- update ("M", &obj1);
+ update ("M", Object(modified->copy()));
}
void Annot::setFlags(Guint new_flags) {
annotLocker();
- Object obj1;
flags = new_flags;
- obj1.initInt(flags);
- update ("F", &obj1);
+ update ("F", Object(int(flags)));
}
void Annot::setBorder(AnnotBorder *new_border) {
@@ -1502,9 +1443,8 @@
delete border;
if (new_border) {
- Object obj1;
- new_border->writeToObject(xref, &obj1);
- update(new_border->getType() == AnnotBorder::typeArray ? "Border" : "BS", &obj1);
+ Object obj1 = new_border->writeToObject(xref);
+ update(new_border->getType() == AnnotBorder::typeArray ? "Border" : "BS", std::move(obj1));
border = new_border;
} else {
border = NULL;
@@ -1517,9 +1457,8 @@
delete color;
if (new_color) {
- Object obj1;
- new_color->writeToObject(xref, &obj1);
- update ("C", &obj1);
+ Object obj1 = new_color->writeToObject(xref);
+ update ("C", std::move(obj1));
color = new_color;
} else {
color = NULL;
@@ -1530,19 +1469,18 @@
void Annot::setPage(int pageIndex, GBool updateP) {
annotLocker();
Page *pageobj = doc->getPage(pageIndex);
- Object obj1;
+ Object obj1(objNull);
if (pageobj) {
Ref pageRef = pageobj->getRef();
- obj1.initRef(pageRef.num, pageRef.gen);
+ obj1 = Object(pageRef.num, pageRef.gen);
page = pageIndex;
} else {
- obj1.initNull();
page = 0;
}
if (updateP) {
- update("P", &obj1);
+ update("P", std::move(obj1));
}
}
@@ -1557,16 +1495,13 @@
delete appearBBox;
appearBBox = NULL;
- Object obj1;
- obj1.initName(state);
- update ("AS", &obj1);
+ update ("AS", Object(objName, state));
// The appearance state determines the current appearance stream
- appearance.free();
if (appearStreams) {
- appearStreams->getAppearanceStream(AnnotAppearance::appearNormal, appearState->getCString(), &appearance);
+ appearance = appearStreams->getAppearanceStream(AnnotAppearance::appearNormal, appearState->getCString());
} else {
- appearance.initNull();
+ appearance.setToNull();
}
}
@@ -1584,18 +1519,15 @@
delete appearBBox;
appearBBox = NULL;
- appearance.free();
- appearance.initNull();
+ appearance.setToNull();
- Object obj1, obj2;
- obj1.initNull();
- if (!annotObj.dictLookup("AP", &obj2)->isNull())
- update ("AP", &obj1); // Remove AP
- obj2.free();
+ Object obj2 = annotObj.dictLookup("AP");
+ if (!obj2.isNull())
+ update ("AP", Object(objNull)); // Remove AP
- if (!annotObj.dictLookup("AS", &obj2)->isNull())
- update ("AS", &obj1); // Remove AS
- obj2.free();
+ obj2 = annotObj.dictLookup("AS");
+ if (!obj2.isNull())
+ update ("AS", Object(objNull)); // Remove AS
}
double Annot::getXMin() {
@@ -1615,16 +1547,13 @@
}
void Annot::readArrayNum(Object *pdfArray, int key, double *value) {
- Object valueObject;
-
- pdfArray->arrayGet(key, &valueObject);
+ Object valueObject = pdfArray->arrayGet(key);
if (valueObject.isNum()) {
*value = valueObject.getNum();
} else {
*value = 0;
ok = gFalse;
}
- valueObject.free();
}
void Annot::removeReferencedObjects() {
@@ -1654,8 +1583,6 @@
}
Annot::~Annot() {
- annotObj.free();
-
delete rect;
delete contents;
@@ -1667,7 +1594,6 @@
delete appearStreams;
delete appearBBox;
- appearance.free();
if (appearState)
delete appearState;
@@ -1678,8 +1604,6 @@
if (color)
delete color;
- oc.free();
-
#if MULTITHREADED
gDestroyMutex(&mutex);
#endif
@@ -1804,74 +1728,66 @@
appearBuf->append("S\n");
}
-void Annot::createForm(double *bbox, GBool transparencyGroup, Object *resDict, Object *aStream) {
- Object obj1, obj2;
- Object appearDict;
+Object Annot::createForm(double *bbox, GBool transparencyGroup, Dict *resDict) {
+ Dict *appearDict = new Dict(xref);
+ appearDict->set("Length", Object(appearBuf->getLength()));
+ appearDict->set("Subtype", Object(objName, "Form"));
- appearDict.initDict(xref);
- appearDict.dictSet("Length", obj1.initInt(appearBuf->getLength()));
- appearDict.dictSet("Subtype", obj1.initName("Form"));
- obj1.initArray(xref);
- obj1.arrayAdd(obj2.initReal(bbox[0]));
- obj1.arrayAdd(obj2.initReal(bbox[1]));
- obj1.arrayAdd(obj2.initReal(bbox[2]));
- obj1.arrayAdd(obj2.initReal(bbox[3]));
- appearDict.dictSet("BBox", &obj1);
+ Array *a = new Array(xref);
+ a->add(Object(bbox[0]));
+ a->add(Object(bbox[1]));
+ a->add(Object(bbox[2]));
+ a->add(Object(bbox[3]));
+ appearDict->set("BBox", Object(a));
if (transparencyGroup) {
- Object transDict;
- transDict.initDict(xref);
- transDict.dictSet("S", obj1.initName("Transparency"));
- appearDict.dictSet("Group", &transDict);
+ Dict *d = new Dict(xref);
+ d->set("S", Object(objName, "Transparency"));
+ appearDict->set("Group", Object(d));
}
if (resDict)
- appearDict.dictSet("Resources", resDict);
+ appearDict->set("Resources", Object(resDict));
MemStream *mStream = new MemStream(copyString(appearBuf->getCString()), 0,
- appearBuf->getLength(), &appearDict);
+ appearBuf->getLength(), Object(appearDict));
mStream->setNeedFree(gTrue);
- aStream->initStream(mStream);
+ return Object(static_cast<Stream*>(mStream));
}
-void Annot::createResourcesDict(const char *formName, Object *formStream,
+Dict *Annot::createResourcesDict(const char *formName, Object &&formStream,
const char *stateName,
- double opacity, const char *blendMode,
- Object *resDict) {
- Object gsDict, stateDict, formDict, obj1;
-
- gsDict.initDict(xref);
+ double opacity, const char *blendMode) {
+ Dict *gsDict = new Dict(xref);
if (opacity != 1) {
- gsDict.dictSet("CA", obj1.initReal(opacity));
- gsDict.dictSet("ca", obj1.initReal(opacity));
+ gsDict->set("CA", Object(opacity));
+ gsDict->set("ca", Object(opacity));
}
if (blendMode)
- gsDict.dictSet("BM", obj1.initName(blendMode));
- stateDict.initDict(xref);
- stateDict.dictSet(stateName, &gsDict);
- formDict.initDict(xref);
- formDict.dictSet(formName, formStream);
+ gsDict->set("BM", Object(objName, blendMode));
+ Dict *stateDict = new Dict(xref);
+ stateDict->set(stateName, Object(gsDict));
+ Dict *formDict = new Dict(xref);
+ formDict->set(formName, std::move(formStream));
- resDict->initDict(xref);
- resDict->dictSet("ExtGState", &stateDict);
- resDict->dictSet("XObject", &formDict);
+ Dict *resDict = new Dict(xref);
+ resDict->set("ExtGState", Object(stateDict));
+ resDict->set("XObject", Object(formDict));
+
+ return resDict;
}
-Object *Annot::getAppearanceResDict(Object *dest) {
+Object Annot::getAppearanceResDict() {
Object obj1, obj2;
- dest->initNull(); // Default value
-
// Fetch appearance's resource dict (if any)
- appearance.fetch(xref, &obj1);
+ obj1 = appearance.fetch(xref);
if (obj1.isStream()) {
- obj1.streamGetDict()->lookup("Resources", &obj2);
+ obj2 = obj1.streamGetDict()->lookup("Resources");
if (obj2.isDict()) {
- obj2.copy(dest);
+ return obj2;
}
- obj2.free();
}
- obj1.free();
- return dest;
+ return Object(objNull);
}
GBool Annot::isVisible(GBool printing) {
@@ -1905,17 +1821,14 @@
}
void Annot::draw(Gfx *gfx, GBool printing) {
- Object obj;
-
annotLocker();
if (!isVisible (printing))
return;
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ Object obj = appearance.fetch(gfx->getXRef());
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
- obj.free();
}
//------------------------------------------------------------------------
@@ -1928,52 +1841,45 @@
type = typePopup;
- annotObj.dictSet ("Subtype", obj1.initName ("Popup"));
+ annotObj.dictSet ("Subtype", Object(objName, "Popup"));
initialize (docA, annotObj.getDict());
}
-AnnotPopup::AnnotPopup(PDFDoc *docA, Dict *dict, Object *obj) :
- Annot(docA, dict, obj) {
+AnnotPopup::AnnotPopup(PDFDoc *docA, Object *dictObject, Object *obj) :
+ Annot(docA, dictObject, obj) {
type = typePopup;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotPopup::~AnnotPopup() {
- parent.free();
}
void AnnotPopup::initialize(PDFDoc *docA, Dict *dict) {
- Object obj1;
-
- if (!dict->lookupNF("Parent", &parent)->isRef()) {
- parent.initNull();
+ parent = dict->lookupNF("Parent");
+ if (!parent.isRef()) {
+ parent.setToNull();
}
- if (dict->lookup("Open", &obj1)->isBool()) {
+ Object obj1 = dict->lookup("Open");
+ if (obj1.isBool()) {
open = obj1.getBool();
} else {
open = gFalse;
}
- obj1.free();
}
void AnnotPopup::setParent(Object *parentA) {
- parentA->copy(&parent);
- update ("Parent", &parent);
+ update ("Parent", parentA->copy());
}
void AnnotPopup::setParent(Annot *parentA) {
- Ref parentRef = parentA->getRef();
- parent.initRef(parentRef.num, parentRef.gen);
- update ("Parent", &parent);
+ const Ref parentRef = parentA->getRef();
+ update ("Parent", Object(parentRef.num, parentRef.gen));
}
void AnnotPopup::setOpen(GBool openA) {
- Object obj1;
-
open = openA;
- obj1.initBool(open);
- update ("Open", &obj1);
+ update ("Open", Object(open));
}
//------------------------------------------------------------------------
@@ -1984,9 +1890,9 @@
initialize(docA, annotObj.getDict(), &annotObj);
}
-AnnotMarkup::AnnotMarkup(PDFDoc *docA, Dict *dict, Object *obj) :
- Annot(docA, dict, obj) {
- initialize(docA, dict, obj);
+AnnotMarkup::AnnotMarkup(PDFDoc *docA, Object *dictObject, Object *obj) :
+ Annot(docA, dictObject, obj) {
+ initialize(docA, dictObject->getDict(), obj);
}
AnnotMarkup::~AnnotMarkup() {
@@ -2006,50 +1912,52 @@
void AnnotMarkup::initialize(PDFDoc *docA, Dict *dict, Object *obj) {
Object obj1, obj2;
- if (dict->lookup("T", &obj1)->isString()) {
+ obj1 = dict->lookup("T");
+ if (obj1.isString()) {
label = obj1.getString()->copy();
} else {
label = NULL;
}
- obj1.free();
- if (dict->lookup("Popup", &obj1)->isDict() && dict->lookupNF("Popup", &obj2)->isRef()) {
- popup = new AnnotPopup(docA, obj1.getDict(), &obj2);
+ obj1 = dict->lookup("Popup");
+ obj2 = dict->lookupNF("Popup");
+ if (obj1.isDict() && obj2.isRef()) {
+ popup = new AnnotPopup(docA, &obj1, &obj2);
} else {
popup = NULL;
}
- obj1.free();
- if (dict->lookup("CA", &obj1)->isNum()) {
+ obj1 = dict->lookup("CA");
+ if (obj1.isNum()) {
opacity = obj1.getNum();
} else {
opacity = 1.0;
}
- obj1.free();
- if (dict->lookup("CreationDate", &obj1)->isString()) {
+ obj1 = dict->lookup("CreationDate");
+ if (obj1.isString()) {
date = obj1.getString()->copy();
} else {
date = NULL;
}
- obj1.free();
- if (dict->lookupNF("IRT", &obj1)->isRef()) {
+ obj1 = dict->lookupNF("IRT");
+ if (obj1.isRef()) {
inReplyTo = obj1.getRef();
} else {
inReplyTo.num = 0;
inReplyTo.gen = 0;
}
- obj1.free();
- if (dict->lookup("Subj", &obj1)->isString()) {
+ obj1 = dict->lookup("Subj");
+ if (obj1.isString()) {
subject = obj1.getString()->copy();
} else {
subject = NULL;
}
- obj1.free();
- if (dict->lookup("RT", &obj1)->isName()) {
+ obj1 = dict->lookup("RT");
+ if (obj1.isName()) {
const char *replyName = obj1.getName();
if (!strcmp(replyName, "R")) {
@@ -2062,14 +1970,13 @@
} else {
replyTo = replyTypeR;
}
- obj1.free();
- if (dict->lookup("ExData", &obj1)->isDict()) {
+ obj1 = dict->lookup("ExData");
+ if (obj1.isDict()) {
exData = parseAnnotExternalData(obj1.getDict());
} else {
exData = annotExternalDataMarkupUnknown;
}
- obj1.free();
}
void AnnotMarkup::setLabel(GooString *new_label) {
@@ -2086,9 +1993,7 @@
label = new GooString();
}
- Object obj1;
- obj1.initString(label->copy());
- update ("T", &obj1);
+ update ("T", Object(label->copy()));
}
void AnnotMarkup::setPopup(AnnotPopup *new_popup) {
@@ -2105,11 +2010,8 @@
delete popup;
if (new_popup) {
- Object obj1;
- Ref popupRef = new_popup->getRef();
-
- obj1.initRef (popupRef.num, popupRef.gen);
- update ("Popup", &obj1);
+ const Ref popupRef = new_popup->getRef();
+ update ("Popup", Object(popupRef.num, popupRef.gen));
new_popup->setParent(this);
popup = new_popup;
@@ -2128,11 +2030,8 @@
}
void AnnotMarkup::setOpacity(double opacityA) {
- Object obj1;
-
opacity = opacityA;
- obj1.initReal(opacity);
- update ("CA", &obj1);
+ update ("CA", Object(opacity));
invalidateAppearance();
}
@@ -2144,9 +2043,7 @@
else
date = new GooString();
- Object obj1;
- obj1.initString(date->copy());
- update ("CreationDate", &obj1);
+ update ("CreationDate", Object(date->copy()));
}
void AnnotMarkup::removeReferencedObjects() {
@@ -2167,21 +2064,19 @@
AnnotText::AnnotText(PDFDoc *docA, PDFRectangle *rect) :
AnnotMarkup(docA, rect) {
- Object obj1;
-
type = typeText;
flags |= flagNoZoom | flagNoRotate;
- annotObj.dictSet ("Subtype", obj1.initName ("Text"));
+ annotObj.dictSet ("Subtype", Object(objName, "Text"));
initialize (docA, annotObj.getDict());
}
-AnnotText::AnnotText(PDFDoc *docA, Dict *dict, Object *obj) :
- AnnotMarkup(docA, dict, obj) {
+AnnotText::AnnotText(PDFDoc *docA, Object *dictObject, Object *obj) :
+ AnnotMarkup(docA, dictObject, obj) {
type = typeText;
flags |= flagNoZoom | flagNoRotate;
- initialize (docA, dict);
+ initialize (docA, dictObject->getDict());
}
AnnotText::~AnnotText() {
@@ -2191,24 +2086,25 @@
void AnnotText::initialize(PDFDoc *docA, Dict *dict) {
Object obj1;
- if (dict->lookup("Open", &obj1)->isBool())
+ obj1 = dict->lookup("Open");
+ if (obj1.isBool())
open = obj1.getBool();
else
open = gFalse;
- obj1.free();
- if (dict->lookup("Name", &obj1)->isName()) {
+ obj1 = dict->lookup("Name");
+ if (obj1.isName()) {
icon = new GooString(obj1.getName());
} else {
icon = new GooString("Note");
}
- obj1.free();
- if (dict->lookup("StateModel", &obj1)->isString()) {
- Object obj2;
+ obj1 = dict->lookup("StateModel");
+ if (obj1.isString()) {
GooString *modelName = obj1.getString();
- if (dict->lookup("State", &obj2)->isString()) {
+ Object obj2 = dict->lookup("State");
+ if (obj2.isString()) {
GooString *stateName = obj2.getString();
if (!stateName->cmp("Marked")) {
@@ -2231,7 +2127,6 @@
} else {
state = stateUnknown;
}
- obj2.free();
if (!modelName->cmp("Marked")) {
switch (state) {
@@ -2266,15 +2161,13 @@
} else {
state = stateUnknown;
}
- obj1.free();
}
void AnnotText::setOpen(GBool openA) {
Object obj1;
open = openA;
- obj1.initBool(open);
- update ("Open", &obj1);
+ update ("Open", Object(open));
}
void AnnotText::setIcon(GooString *new_icon) {
@@ -2289,9 +2182,7 @@
icon = new GooString("Note");
}
- Object obj1;
- obj1.initName (icon->getCString());
- update("Name", &obj1);
+ update("Name", Object(objName, icon->getCString()));
invalidateAppearance();
}
@@ -2540,7 +2431,6 @@
"19.5 12.5 m S\n"
void AnnotText::draw(Gfx *gfx, GBool printing) {
- Object obj;
double ca = 1;
if (!isVisible (printing))
@@ -2583,22 +2473,20 @@
double bbox[4];
appearBBox->getBBoxRect(bbox);
if (ca == 1) {
- createForm(bbox, gFalse, NULL, &appearance);
+ appearance = createForm(bbox, gFalse, nullptr);
} else {
- Object aStream, resDict;
-
- createForm(bbox, gTrue, NULL, &aStream);
+ Object aStream = createForm(bbox, gTrue, nullptr);
delete appearBuf;
appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
- createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
- createForm(bbox, gFalse, &resDict, &appearance);
+ Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
+ appearance = createForm(bbox, gFalse, resDict);
}
delete appearBuf;
}
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ Object obj = appearance.fetch(gfx->getXRef());
if (appearBBox) {
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
appearBBox->getPageXMin(), appearBBox->getPageYMin(),
@@ -2608,7 +2496,6 @@
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
}
- obj.free();
}
//------------------------------------------------------------------------
@@ -2619,15 +2506,15 @@
Object obj1;
type = typeLink;
- annotObj.dictSet ("Subtype", obj1.initName ("Link"));
+ annotObj.dictSet ("Subtype", Object(objName, "Link"));
initialize (docA, annotObj.getDict());
}
-AnnotLink::AnnotLink(PDFDoc *docA, Dict *dict, Object *obj) :
- Annot(docA, dict, obj) {
+AnnotLink::AnnotLink(PDFDoc *docA, Object *dictObject, Object *obj) :
+ Annot(docA, dictObject, obj) {
type = typeLink;
- initialize (docA, dict);
+ initialize (docA, dictObject->getDict());
}
AnnotLink::~AnnotLink() {
@@ -2646,18 +2533,19 @@
action = NULL;
// look for destination
- if (!dict->lookup("Dest", &obj1)->isNull()) {
+ obj1 = dict->lookup("Dest");
+ if (!obj1.isNull()) {
action = LinkAction::parseDest(&obj1);
// look for action
} else {
- obj1.free();
- if (dict->lookup("A", &obj1)->isDict()) {
+ obj1 = dict->lookup("A");
+ if (obj1.isDict()) {
action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI());
}
}
- obj1.free();
- if (dict->lookup("H", &obj1)->isName()) {
+ obj1 = dict->lookup("H");
+ if (obj1.isName()) {
const char *effect = obj1.getName();
if (!strcmp(effect, "N")) {
@@ -2674,43 +2562,40 @@
} else {
linkEffect = effectInvert;
}
- obj1.free();
/*
- if (dict->lookup("PA", &obj1)->isDict()) {
+ obj1 = dict->lookup("PA");
+ if (obj1.isDict()) {
uriAction = NULL;
} else {
uriAction = NULL;
}
obj1.free();
*/
- if (dict->lookup("QuadPoints", &obj1)->isArray()) {
+ obj1 = dict->lookup("QuadPoints");
+ if (obj1.isArray()) {
quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect);
} else {
quadrilaterals = NULL;
}
- obj1.free();
- if (dict->lookup("BS", &obj1)->isDict()) {
+ obj1 = dict->lookup("BS");
+ if (obj1.isDict()) {
delete border;
border = new AnnotBorderBS(obj1.getDict());
} else if (!border) {
border = new AnnotBorderBS();
}
- obj1.free();
}
void AnnotLink::draw(Gfx *gfx, GBool printing) {
- Object obj;
-
if (!isVisible (printing))
return;
annotLocker();
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ Object obj = appearance.fetch(gfx->getXRef());
gfx->drawAnnot(&obj, border, color,
rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
- obj.free();
}
//------------------------------------------------------------------------
@@ -2722,19 +2607,16 @@
type = typeFreeText;
- annotObj.dictSet ("Subtype", obj1.initName ("FreeText"));
-
- Object obj2;
- obj2.initString (da->copy());
- annotObj.dictSet("DA", &obj2);
+ annotObj.dictSet ("Subtype", Object(objName, "FreeText"));
+ annotObj.dictSet("DA", Object(da->copy()));
initialize (docA, annotObj.getDict());
}
-AnnotFreeText::AnnotFreeText(PDFDoc *docA, Dict *dict, Object *obj) :
- AnnotMarkup(docA, dict, obj) {
+AnnotFreeText::AnnotFreeText(PDFDoc *docA, Object *dictObject, Object *obj) :
+ AnnotMarkup(docA, dictObject, obj) {
type = typeFreeText;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotFreeText::~AnnotFreeText() {
@@ -2756,48 +2638,43 @@
void AnnotFreeText::initialize(PDFDoc *docA, Dict *dict) {
Object obj1;
- if (dict->lookup("DA", &obj1)->isString()) {
+ obj1 = dict->lookup("DA");
+ if (obj1.isString()) {
appearanceString = obj1.getString()->copy();
} else {
appearanceString = new GooString();
error(errSyntaxError, -1, "Bad appearance for annotation");
ok = gFalse;
}
- obj1.free();
- if (dict->lookup("Q", &obj1)->isInt()) {
+ obj1 = dict->lookup("Q");
+ if (obj1.isInt()) {
quadding = (AnnotFreeTextQuadding) obj1.getInt();
} else {
quadding = quaddingLeftJustified;
}
- obj1.free();
- if (dict->lookup("DS", &obj1)->isString()) {
+ obj1 = dict->lookup("DS");
+ if (obj1.isString()) {
styleString = obj1.getString()->copy();
} else {
styleString = NULL;
}
- obj1.free();
- if (dict->lookup("CL", &obj1)->isArray() && obj1.arrayGetLength() >= 4) {
+ obj1 = dict->lookup("CL");
+ if (obj1.isArray() && obj1.arrayGetLength() >= 4) {
double x1, y1, x2, y2;
Object obj2;
- (obj1.arrayGet(0, &obj2)->isNum() ? x1 = obj2.getNum() : x1 = 0);
- obj2.free();
- (obj1.arrayGet(1, &obj2)->isNum() ? y1 = obj2.getNum() : y1 = 0);
- obj2.free();
- (obj1.arrayGet(2, &obj2)->isNum() ? x2 = obj2.getNum() : x2 = 0);
- obj2.free();
- (obj1.arrayGet(3, &obj2)->isNum() ? y2 = obj2.getNum() : y2 = 0);
- obj2.free();
+ (obj2 = obj1.arrayGet(0), obj2.isNum() ? x1 = obj2.getNum() : x1 = 0);
+ (obj2 = obj1.arrayGet(1), obj2.isNum() ? y1 = obj2.getNum() : y1 = 0);
+ (obj2 = obj1.arrayGet(2), obj2.isNum() ? x2 = obj2.getNum() : x2 = 0);
+ (obj2 = obj1.arrayGet(3), obj2.isNum() ? y2 = obj2.getNum() : y2 = 0);
if (obj1.arrayGetLength() == 6) {
double x3, y3;
- (obj1.arrayGet(4, &obj2)->isNum() ? x3 = obj2.getNum() : x3 = 0);
- obj2.free();
- (obj1.arrayGet(5, &obj2)->isNum() ? y3 = obj2.getNum() : y3 = 0);
- obj2.free();
+ (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);
} else {
calloutLine = new AnnotCalloutLine(x1, y1, x2, y2);
@@ -2805,9 +2682,9 @@
} else {
calloutLine = NULL;
}
- obj1.free();
- if (dict->lookup("IT", &obj1)->isName()) {
+ obj1 = dict->lookup("IT");
+ if (obj1.isName()) {
const char *intentName = obj1.getName();
if (!strcmp(intentName, "FreeText")) {
@@ -2822,37 +2699,36 @@
} else {
intent = intentFreeText;
}
- obj1.free();
- if (dict->lookup("BS", &obj1)->isDict()) {
+ obj1 = dict->lookup("BS");
+ if (obj1.isDict()) {
delete border;
border = new AnnotBorderBS(obj1.getDict());
} else if (!border) {
border = new AnnotBorderBS();
}
- obj1.free();
- if (dict->lookup("BE", &obj1)->isDict()) {
+ obj1 = dict->lookup("BE");
+ if (obj1.isDict()) {
borderEffect = new AnnotBorderEffect(obj1.getDict());
} else {
borderEffect = NULL;
}
- obj1.free();
- if (dict->lookup("RD", &obj1)->isArray()) {
+ obj1 = dict->lookup("RD");
+ if (obj1.isArray()) {
rectangle = parseDiffRectangle(obj1.getArray(), rect);
} else {
rectangle = NULL;
}
- obj1.free();
- if (dict->lookup("LE", &obj1)->isName()) {
+ obj1 = dict->lookup("LE");
+ if (obj1.isName()) {
GooString styleName(obj1.getName());
endStyle = parseAnnotLineEndingStyle(&styleName);
} else {
endStyle = annotLineEndingNone;
}
- obj1.free();
}
void AnnotFreeText::setContents(GooString *new_content) {
@@ -2869,17 +2745,14 @@
appearanceString = new GooString();
}
- Object obj1;
- obj1.initString(appearanceString->copy());
- update ("DA", &obj1);
+ update ("DA", Object(appearanceString->copy()));
invalidateAppearance();
}
void AnnotFreeText::setQuadding(AnnotFreeTextQuadding new_quadding) {
Object obj1;
quadding = new_quadding;
- obj1.initInt((int)quadding);
- update ("Q", &obj1);
+ update ("Q", Object((int)quadding));
invalidateAppearance();
}
@@ -2897,9 +2770,7 @@
styleString = new GooString();
}
- Object obj1;
- obj1.initString(styleString->copy());
- update ("DS", &obj1);
+ update ("DS", Object(styleString->copy()));
}
void AnnotFreeText::setCalloutLine(AnnotCalloutLine *line) {
@@ -2907,73 +2778,59 @@
Object obj1;
if (line == NULL) {
- obj1.initNull();
+ obj1.setToNull();
calloutLine = NULL;
} else {
double x1 = line->getX1(), y1 = line->getY1();
double x2 = line->getX2(), y2 = line->getY2();
- Object obj2;
- obj1.initArray(xref);
- obj1.arrayAdd( obj2.initReal(x1) );
- obj1.arrayAdd( obj2.initReal(y1) );
- obj1.arrayAdd( obj2.initReal(x2) );
- obj1.arrayAdd( obj2.initReal(y2) );
+ obj1 = Object( new Array(xref) );
+ obj1.arrayAdd( Object(x1) );
+ obj1.arrayAdd( Object(y1) );
+ obj1.arrayAdd( Object(x2) );
+ obj1.arrayAdd( Object(y2) );
AnnotCalloutMultiLine *mline = dynamic_cast<AnnotCalloutMultiLine*>(line);
if (mline) {
double x3 = mline->getX3(), y3 = mline->getY3();
- obj1.arrayAdd( obj2.initReal(x3) );
- obj1.arrayAdd( obj2.initReal(y3) );
+ obj1.arrayAdd( Object(x3) );
+ obj1.arrayAdd( Object(y3) );
calloutLine = new AnnotCalloutMultiLine(x1, y1, x2, y2, x3, y3);
} else {
calloutLine = new AnnotCalloutLine(x1, y1, x2, y2);
}
}
- update("CL", &obj1);
+ update("CL", std::move(obj1));
invalidateAppearance();
}
void AnnotFreeText::setIntent(AnnotFreeTextIntent new_intent) {
- Object obj1;
+ const char *intentName;
intent = new_intent;
if (new_intent == intentFreeText)
- obj1.initName("FreeText");
+ intentName = "FreeText";
else if (new_intent == intentFreeTextCallout)
- obj1.initName("FreeTextCallout");
+ intentName = "FreeTextCallout";
else // intentFreeTextTypeWriter
- obj1.initName("FreeTextTypeWriter");
- update ("IT", &obj1);
+ intentName = "FreeTextTypeWriter";
+ update ("IT", Object(objName, intentName));
}
-static GfxFont * createAnnotDrawFont(XRef * xref, Object *fontResDict)
+static GfxFont * createAnnotDrawFont(XRef * xref, Dict *fontResDict)
{
- Ref dummyRef = { -1, -1 };
+ const Ref dummyRef = { -1, -1 };
- Object baseFontObj, subtypeObj, encodingObj;
- baseFontObj.initName("Helvetica");
- subtypeObj.initName("Type0");
- encodingObj.initName("WinAnsiEncoding");
-
- Object fontDictObj;
Dict *fontDict = new Dict(xref);
- fontDict->decRef();
- fontDict->add(copyString("BaseFont"), &baseFontObj);
- fontDict->add(copyString("Subtype"), &subtypeObj);
- fontDict->add(copyString("Encoding"), &encodingObj);
- fontDictObj.initDict(fontDict);
+ fontDict->add(copyString("BaseFont"), Object(objName, "Helvetica"));
+ fontDict->add(copyString("Subtype"), Object(objName, "Type0"));
+ fontDict->add(copyString("Encoding"), Object(objName, "WinAnsiEncoding"));
- Object fontsDictObj;
Dict *fontsDict = new Dict(xref);
- fontsDict->decRef();
- fontsDict->add(copyString("AnnotDrawFont"), &fontDictObj);
- fontsDictObj.initDict(fontsDict);
+ fontsDict->add(copyString("AnnotDrawFont"), Object(fontDict));
- Dict *dict = new Dict(xref);
- dict->add(copyString("Font"), &fontsDictObj);
+ fontResDict->add(copyString("Font"), Object(fontsDict));
- fontResDict->initDict(dict);
return GfxFont::makeFont(xref, "AnnotDrawFont", dummyRef, fontDict);
}
@@ -3072,8 +2929,8 @@
const double textwidth = width - 2*textmargin;
appearBuf->appendf ("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re W n\n", textmargin, textwidth, height - 2*textmargin);
- Object fontResDict;
- GfxFont *font = createAnnotDrawFont(xref, &fontResDict);
+ Dict *fontResDict = new Dict(xref);
+ GfxFont *font = createAnnotDrawFont(xref, fontResDict);
// Set font state
setColor(fontcolor, gTrue);
@@ -3114,23 +2971,19 @@
bbox[3] = rect->y2 - rect->y1;
if (ca == 1) {
- createForm(bbox, gFalse, &fontResDict, &appearance);
+ appearance = createForm(bbox, gFalse, fontResDict);
} else {
- Object aStream, resDict;
-
- createForm(bbox, gTrue, &fontResDict, &aStream);
+ Object aStream = createForm(bbox, gTrue, fontResDict);
delete appearBuf;
appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
- createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
- createForm(bbox, gFalse, &resDict, &appearance);
+ Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
+ appearance = createForm(bbox, gFalse, resDict);
}
delete appearBuf;
}
void AnnotFreeText::draw(Gfx *gfx, GBool printing) {
- Object obj;
-
if (!isVisible (printing))
return;
@@ -3140,19 +2993,18 @@
}
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ Object obj = appearance.fetch(gfx->getXRef());
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
- obj.free();
}
// Before retrieving the res dict, regenerate the appearance stream if needed,
// because AnnotFreeText::draw needs to store font info in the res dict
-Object *AnnotFreeText::getAppearanceResDict(Object *dest) {
+Object AnnotFreeText::getAppearanceResDict() {
if (appearance.isNull()) {
generateFreeTextAppearance();
}
- return Annot::getAppearanceResDict(dest);
+ return Annot::getAppearanceResDict();
}
//------------------------------------------------------------------------
@@ -3164,15 +3016,15 @@
Object obj1;
type = typeLine;
- annotObj.dictSet ("Subtype", obj1.initName ("Line"));
+ annotObj.dictSet ("Subtype", Object(objName, "Line"));
initialize (docA, annotObj.getDict());
}
-AnnotLine::AnnotLine(PDFDoc *docA, Dict *dict, Object *obj) :
- AnnotMarkup(docA, dict, obj) {
+AnnotLine::AnnotLine(PDFDoc *docA, Object *dictObject, Object *obj) :
+ AnnotMarkup(docA, dictObject, obj) {
type = typeLine;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotLine::~AnnotLine() {
@@ -3189,18 +3041,15 @@
void AnnotLine::initialize(PDFDoc *docA, Dict *dict) {
Object obj1;
- if (dict->lookup("L", &obj1)->isArray() && obj1.arrayGetLength() == 4) {
+ obj1 = dict->lookup("L");
+ if (obj1.isArray() && obj1.arrayGetLength() == 4) {
Object obj2;
double x1, y1, x2, y2;
- (obj1.arrayGet(0, &obj2)->isNum() ? x1 = obj2.getNum() : x1 = 0);
- obj2.free();
- (obj1.arrayGet(1, &obj2)->isNum() ? y1 = obj2.getNum() : y1 = 0);
- obj2.free();
- (obj1.arrayGet(2, &obj2)->isNum() ? x2 = obj2.getNum() : x2 = 0);
- obj2.free();
- (obj1.arrayGet(3, &obj2)->isNum() ? y2 = obj2.getNum() : y2 = 0);
- obj2.free();
+ (obj2 = obj1.arrayGet(0), obj2.isNum() ? x1 = obj2.getNum() : x1 = 0);
+ (obj2 = obj1.arrayGet(1), obj2.isNum() ? y1 = obj2.getNum() : y1 = 0);
+ (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);
@@ -3208,43 +3057,43 @@
coord1 = new AnnotCoord();
coord2 = new AnnotCoord();
}
- obj1.free();
- if (dict->lookup("LE", &obj1)->isArray() && obj1.arrayGetLength() == 2) {
+ obj1 = dict->lookup("LE");
+ if (obj1.isArray() && obj1.arrayGetLength() == 2) {
Object obj2;
- if(obj1.arrayGet(0, &obj2)->isString())
+ obj2 = obj1.arrayGet(0);
+ if (obj2.isString())
startStyle = parseAnnotLineEndingStyle(obj2.getString());
else
startStyle = annotLineEndingNone;
- obj2.free();
- if(obj1.arrayGet(1, &obj2)->isString())
+ obj2 = obj1.arrayGet(1);
+ if (obj2.isString())
endStyle = parseAnnotLineEndingStyle(obj2.getString());
else
endStyle = annotLineEndingNone;
- obj2.free();
} else {
startStyle = endStyle = annotLineEndingNone;
}
- obj1.free();
- if (dict->lookup("IC", &obj1)->isArray()) {
+ obj1 = dict->lookup("IC");
+ if (obj1.isArray()) {
interiorColor = new AnnotColor(obj1.getArray());
} else {
interiorColor = NULL;
}
- obj1.free();
- if (dict->lookup("LL", &obj1)->isNum()) {
+ obj1 = dict->lookup("LL");
+ if (obj1.isNum()) {
leaderLineLength = obj1.getNum();
} else {
leaderLineLength = 0;
}
- obj1.free();
- if (dict->lookup("LLE", &obj1)->isNum()) {
+ obj1 = dict->lookup("LLE");
+ if (obj1.isNum()) {
leaderLineExtension = obj1.getNum();
if (leaderLineExtension < 0)
@@ -3252,16 +3101,16 @@
} else {
leaderLineExtension = 0;
}
- obj1.free();
- if (dict->lookup("Cap", &obj1)->isBool()) {
+ obj1 = dict->lookup("Cap");
+ if (obj1.isBool()) {
caption = obj1.getBool();
} else {
caption = gFalse;
}
- obj1.free();
- if (dict->lookup("IT", &obj1)->isName()) {
+ obj1 = dict->lookup("IT");
+ if (obj1.isName()) {
const char *intentName = obj1.getName();
if(!strcmp(intentName, "LineArrow")) {
@@ -3274,9 +3123,9 @@
} else {
intent = intentLineArrow;
}
- obj1.free();
- if (dict->lookup("LLO", &obj1)->isNum()) {
+ obj1 = dict->lookup("LLO");
+ if (obj1.isNum()) {
leaderLineOffset = obj1.getNum();
if (leaderLineOffset < 0)
@@ -3284,9 +3133,9 @@
} else {
leaderLineOffset = 0;
}
- obj1.free();
- if (dict->lookup("CP", &obj1)->isName()) {
+ obj1 = dict->lookup("CP");
+ if (obj1.isName()) {
const char *captionName = obj1.getName();
if(!strcmp(captionName, "Inline")) {
@@ -3299,36 +3148,33 @@
} else {
captionPos = captionPosInline;
}
- obj1.free();
- if (dict->lookup("Measure", &obj1)->isDict()) {
+ obj1 = dict->lookup("Measure");
+ if (obj1.isDict()) {
measure = NULL;
} else {
measure = NULL;
}
- obj1.free();
- if ((dict->lookup("CO", &obj1)->isArray()) && (obj1.arrayGetLength() == 2)) {
+ obj1 = dict->lookup("CO");
+ if (obj1.isArray() && (obj1.arrayGetLength() == 2)) {
Object obj2;
- (obj1.arrayGet(0, &obj2)->isNum() ? captionTextHorizontal = obj2.getNum() :
- captionTextHorizontal = 0);
- obj2.free();
- (obj1.arrayGet(1, &obj2)->isNum() ? captionTextVertical = obj2.getNum() :
- captionTextVertical = 0);
- obj2.free();
+ obj2 = obj1.arrayGet(0);
+ captionTextHorizontal = obj2.isNum() ? obj2.getNum() : 0;
+ obj2 = obj1.arrayGet(1);
+ captionTextVertical = obj2.isNum() ? obj2.getNum() : 0;
} else {
captionTextHorizontal = captionTextVertical = 0;
}
- obj1.free();
- if (dict->lookup("BS", &obj1)->isDict()) {
+ obj1 = dict->lookup("BS");
+ if (obj1.isDict()) {
delete border;
border = new AnnotBorderBS(obj1.getDict());
} else if (!border) {
border = new AnnotBorderBS();
}
- obj1.free();
}
void AnnotLine::setContents(GooString *new_content) {
@@ -3338,34 +3184,30 @@
}
void AnnotLine::setVertices(double x1, double y1, double x2, double y2) {
- Object obj1, obj2;
-
delete coord1;
coord1 = new AnnotCoord(x1, y1);
delete coord2;
coord2 = new AnnotCoord(x2, y2);
- obj1.initArray(xref);
- obj1.arrayAdd( obj2.initReal(x1) );
- obj1.arrayAdd( obj2.initReal(y1) );
- obj1.arrayAdd( obj2.initReal(x2) );
- obj1.arrayAdd( obj2.initReal(y2) );
+ Array *lArray = new Array(xref);
+ lArray->add( Object(x1) );
+ lArray->add( Object(y1) );
+ lArray->add( Object(x2) );
+ lArray->add( Object(y2) );
- update("L", &obj1);
+ update("L", Object(lArray));
invalidateAppearance();
}
void AnnotLine::setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end) {
- Object obj1, obj2;
-
startStyle = start;
endStyle = end;
- obj1.initArray(xref);
- obj1.arrayAdd( obj2.initName(convertAnnotLineEndingStyle( startStyle )) );
- obj1.arrayAdd( obj2.initName(convertAnnotLineEndingStyle( endStyle )) );
+ Array *leArray = new Array(xref);
+ leArray->add( Object(objName, convertAnnotLineEndingStyle( startStyle )) );
+ leArray->add( Object(objName, convertAnnotLineEndingStyle( endStyle )) );
- update("LE", &obj1);
+ update("LE", Object(leArray));
invalidateAppearance();
}
@@ -3373,9 +3215,8 @@
delete interiorColor;
if (new_color) {
- Object obj1;
- new_color->writeToObject(xref, &obj1);
- update ("IC", &obj1);
+ Object obj1 = new_color->writeToObject(xref);
+ update ("IC", std::move(obj1));
interiorColor = new_color;
} else {
interiorColor = NULL;
@@ -3384,45 +3225,35 @@
}
void AnnotLine::setLeaderLineLength(double len) {
- Object obj1;
-
leaderLineLength = len;
- obj1.initReal(len);
- update ("LL", &obj1);
+ update ("LL", Object(len));
invalidateAppearance();
}
void AnnotLine::setLeaderLineExtension(double len) {
- Object obj1;
-
leaderLineExtension = len;
- obj1.initReal(len);
- update ("LLE", &obj1);
+ update ("LLE", Object(len));
// LL is required if LLE is present
- obj1.initReal(leaderLineLength);
- update ("LL", &obj1);
+ update ("LL", Object(leaderLineLength));
invalidateAppearance();
}
void AnnotLine::setCaption(bool new_cap) {
- Object obj1;
-
caption = new_cap;
- obj1.initBool(new_cap);
- update ("Cap", &obj1);
+ update ("Cap", Object(new_cap));
invalidateAppearance();
}
void AnnotLine::setIntent(AnnotLineIntent new_intent) {
- Object obj1;
+ const char *intentName;
intent = new_intent;
if (new_intent == intentLineArrow)
- obj1.initName("LineArrow");
+ intentName = "LineArrow";
else // intentLineDimension
- obj1.initName("LineDimension");
- update ("IT", &obj1);
+ intentName = "LineDimension";
+ update ("IT", Object(objName, intentName));
}
void AnnotLine::generateLineAppearance()
@@ -3463,12 +3294,13 @@
const double captionhmargin = 2; // Left and right margin (inline caption only)
const double captionmaxwidth = main_len - 2 * captionhmargin;
- Object fontResDict;
+ Dict *fontResDict;
GfxFont *font;
// Calculate caption width and height
if (caption) {
- font = createAnnotDrawFont(xref, &fontResDict);
+ fontResDict = new Dict(xref);
+ font = createAnnotDrawFont(xref, fontResDict);
int lines = 0;
int i = 0;
while (i < contents->getLength()) {
@@ -3487,7 +3319,7 @@
actualCaptionPos = captionPosTop;
}
} else {
- fontResDict.initNull();
+ fontResDict = nullptr;
font = NULL;
}
@@ -3579,23 +3411,19 @@
double bbox[4];
appearBBox->getBBoxRect(bbox);
if (ca == 1) {
- createForm(bbox, gFalse, &fontResDict, &appearance);
+ appearance = createForm(bbox, gFalse, fontResDict);
} else {
- Object aStream, resDict;
-
- createForm(bbox, gTrue, &fontResDict, &aStream);
+ Object aStream = createForm(bbox, gTrue, fontResDict);
delete appearBuf;
appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
- createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
- createForm(bbox, gFalse, &resDict, &appearance);
+ Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
+ appearance = createForm(bbox, gFalse, resDict);
}
delete appearBuf;
}
void AnnotLine::draw(Gfx *gfx, GBool printing) {
- Object obj;
-
if (!isVisible (printing))
return;
@@ -3605,7 +3433,7 @@
}
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ Object obj = appearance.fetch(gfx->getXRef());
if (appearBBox) {
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
appearBBox->getPageXMin(), appearBBox->getPageYMin(),
@@ -3615,16 +3443,15 @@
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
}
- obj.free();
}
// Before retrieving the res dict, regenerate the appearance stream if needed,
// because AnnotLine::draw may need to store font info in the res dict
-Object *AnnotLine::getAppearanceResDict(Object *dest) {
+Object AnnotLine::getAppearanceResDict() {
if (appearance.isNull()) {
generateLineAppearance();
}
- return Annot::getAppearanceResDict(dest);
+ return Annot::getAppearanceResDict();
}
//------------------------------------------------------------------------
@@ -3636,43 +3463,43 @@
switch (subType) {
case typeHighlight:
- annotObj.dictSet ("Subtype", obj1.initName ("Highlight"));
+ annotObj.dictSet ("Subtype", Object(objName, "Highlight"));
break;
case typeUnderline:
- annotObj.dictSet ("Subtype", obj1.initName ("Underline"));
+ annotObj.dictSet ("Subtype", Object(objName, "Underline"));
break;
case typeSquiggly:
- annotObj.dictSet ("Subtype", obj1.initName ("Squiggly"));
+ annotObj.dictSet ("Subtype", Object(objName, "Squiggly"));
break;
case typeStrikeOut:
- annotObj.dictSet ("Subtype", obj1.initName ("StrikeOut"));
+ annotObj.dictSet ("Subtype", Object(objName, "StrikeOut"));
break;
default:
assert (0 && "Invalid subtype for AnnotTextMarkup\n");
}
// Store dummy quadrilateral with null coordinates
- Object obj2, obj3;
- obj2.initArray (doc->getXRef());
+ Array *quadPoints = new Array(doc->getXRef());
for (int i = 0; i < 4*2; ++i) {
- obj2.arrayAdd (obj3.initReal (0));
+ quadPoints->add(Object(0.));
}
- annotObj.dictSet ("QuadPoints", &obj2);
+ annotObj.dictSet ("QuadPoints", Object(quadPoints));
initialize(docA, annotObj.getDict());
}
-AnnotTextMarkup::AnnotTextMarkup(PDFDoc *docA, Dict *dict, Object *obj) :
- AnnotMarkup(docA, dict, obj) {
+AnnotTextMarkup::AnnotTextMarkup(PDFDoc *docA, Object *dictObject, Object *obj) :
+ AnnotMarkup(docA, dictObject, obj) {
// the real type will be read in initialize()
type = typeHighlight;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
void AnnotTextMarkup::initialize(PDFDoc *docA, Dict *dict) {
Object obj1;
- if (dict->lookup("Subtype", &obj1)->isName()) {
+ obj1 = dict->lookup("Subtype");
+ if (obj1.isName()) {
GooString typeName(obj1.getName());
if (!typeName.cmp("Highlight")) {
type = typeHighlight;
@@ -3684,76 +3511,70 @@
type = typeStrikeOut;
}
}
- obj1.free();
- if(dict->lookup("QuadPoints", &obj1)->isArray()) {
+ obj1 = dict->lookup("QuadPoints");
+ if (obj1.isArray()) {
quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect);
} else {
error(errSyntaxError, -1, "Bad Annot Text Markup QuadPoints");
quadrilaterals = NULL;
ok = gFalse;
}
- obj1.free();
}
AnnotTextMarkup::~AnnotTextMarkup() {
- if(quadrilaterals) {
- delete quadrilaterals;
- }
+ delete quadrilaterals;
}
void AnnotTextMarkup::setType(AnnotSubtype new_type) {
- Object obj1;
+ const char *typeName;
switch (new_type) {
case typeHighlight:
- obj1.initName("Highlight");
+ typeName = "Highlight";
break;
case typeUnderline:
- obj1.initName("Underline");
+ typeName = "Underline";
break;
case typeSquiggly:
- obj1.initName("Squiggly");
+ typeName = "Squiggly";
break;
case typeStrikeOut:
- obj1.initName("StrikeOut");
+ typeName = "StrikeOut";
break;
default:
assert(!"Invalid subtype");
}
type = new_type;
- update("Subtype", &obj1);
+ update("Subtype", Object(objName, typeName));
invalidateAppearance();
}
void AnnotTextMarkup::setQuadrilaterals(AnnotQuadrilaterals *quadPoints) {
- Object obj1, obj2;
- obj1.initArray (xref);
+ Array *a = new Array(xref);
for (int i = 0; i < quadPoints->getQuadrilateralsLength(); ++i) {
- obj1.arrayAdd (obj2.initReal (quadPoints->getX1(i)));
- obj1.arrayAdd (obj2.initReal (quadPoints->getY1(i)));
- obj1.arrayAdd (obj2.initReal (quadPoints->getX2(i)));
- obj1.arrayAdd (obj2.initReal (quadPoints->getY2(i)));
- obj1.arrayAdd (obj2.initReal (quadPoints->getX3(i)));
- obj1.arrayAdd (obj2.initReal (quadPoints->getY3(i)));
- obj1.arrayAdd (obj2.initReal (quadPoints->getX4(i)));
- obj1.arrayAdd (obj2.initReal (quadPoints->getY4(i)));
+ a->add(Object(quadPoints->getX1(i)));
+ a->add(Object(quadPoints->getY1(i)));
+ a->add(Object(quadPoints->getX2(i)));
+ a->add(Object(quadPoints->getY2(i)));
+ a->add(Object(quadPoints->getX3(i)));
+ a->add(Object(quadPoints->getY3(i)));
+ a->add(Object(quadPoints->getX4(i)));
+ a->add(Object(quadPoints->getY4(i)));
}
delete quadrilaterals;
- quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect);
+ quadrilaterals = new AnnotQuadrilaterals(a, rect);
- annotObj.dictSet ("QuadPoints", &obj1);
+ annotObj.dictSet ("QuadPoints", Object(a));
invalidateAppearance();
}
void AnnotTextMarkup::draw(Gfx *gfx, GBool printing) {
- Object obj;
double ca = 1;
int i;
- Object obj1, obj2;
if (!isVisible (printing))
return;
@@ -3850,8 +3671,6 @@
break;
default:
case typeHighlight:
- appearance.free();
-
if (color)
setColor(color, gTrue);
@@ -3887,32 +3706,32 @@
}
appearBuf->append ("Q\n");
- Object aStream, resDict;
+ Object aStream;
double bbox[4];
bbox[0] = appearBBox->getPageXMin();
bbox[1] = appearBBox->getPageYMin();
bbox[2] = appearBBox->getPageXMax();
bbox[3] = appearBBox->getPageYMax();
- createForm(bbox, gTrue, NULL, &aStream);
+ aStream = createForm(bbox, gTrue, NULL);
delete appearBuf;
appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
- createResourcesDict("Fm0", &aStream, "GS0", 1, blendMultiply ? "Multiply" : NULL, &resDict);
+ Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", 1, blendMultiply ? "Multiply" : NULL);
if (ca == 1) {
- createForm(bbox, gFalse, &resDict, &appearance);
+ appearance = createForm(bbox, gFalse, resDict);
} else {
- createForm(bbox, gTrue, &resDict, &aStream);
+ aStream = createForm(bbox, gTrue, resDict);
delete appearBuf;
appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
- createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
- createForm(bbox, gFalse, &resDict, &appearance);
+ Dict *resDict2 = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
+ appearance = createForm(bbox, gFalse, resDict2);
}
delete appearBuf;
}
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ Object obj = appearance.fetch(gfx->getXRef());
if (appearBBox) {
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
appearBBox->getPageXMin(), appearBBox->getPageYMin(),
@@ -3922,25 +3741,24 @@
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
}
- obj.free();
}
//------------------------------------------------------------------------
// AnnotWidget
//------------------------------------------------------------------------
-AnnotWidget::AnnotWidget(PDFDoc *docA, Dict *dict, Object *obj) :
- Annot(docA, dict, obj) {
+AnnotWidget::AnnotWidget(PDFDoc *docA, Object *dictObject, Object *obj) :
+ Annot(docA, dictObject, obj) {
type = typeWidget;
field = NULL;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
-AnnotWidget::AnnotWidget(PDFDoc *docA, Dict *dict, Object *obj, FormField *fieldA) :
- Annot(docA, dict, obj) {
+AnnotWidget::AnnotWidget(PDFDoc *docA, Object *dictObject, Object *obj, FormField *fieldA) :
+ Annot(docA, dictObject, obj) {
type = typeWidget;
field = fieldA;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotWidget::~AnnotWidget() {
@@ -3950,8 +3768,6 @@
if (action)
delete action;
- additionalActions.free();
-
if (parent)
delete parent;
}
@@ -3961,7 +3777,8 @@
form = doc->getCatalog()->getForm();
- if(dict->lookup("H", &obj1)->isName()) {
+ obj1 = dict->lookup("H");
+ if (obj1.isName()) {
const char *modeName = obj1.getName();
if(!strcmp(modeName, "N")) {
@@ -3976,35 +3793,34 @@
} else {
mode = highlightModeInvert;
}
- obj1.free();
- if(dict->lookup("MK", &obj1)->isDict()) {
+ obj1 = dict->lookup("MK");
+ if (obj1.isDict()) {
appearCharacs = new AnnotAppearanceCharacs(obj1.getDict());
} else {
appearCharacs = NULL;
}
- obj1.free();
action = NULL;
- if(dict->lookup("A", &obj1)->isDict()) {
+ obj1 = dict->lookup("A");
+ if (obj1.isDict()) {
action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI());
}
- obj1.free();
- dict->lookupNF("AA", &additionalActions);
+ additionalActions = dict->lookupNF("AA");
- if(dict->lookup("Parent", &obj1)->isDict()) {
+ obj1 = dict->lookup("Parent");
+ if (obj1.isDict()) {
parent = NULL;
} else {
parent = NULL;
}
- obj1.free();
- if (dict->lookup("BS", &obj1)->isDict()) {
+ obj1 = dict->lookup("BS");
+ if (obj1.isDict()) {
delete border;
border = new AnnotBorderBS(obj1.getDict());
}
- obj1.free();
updatedAppearanceStream.num = updatedAppearanceStream.gen = -1;
}
@@ -5037,9 +4853,7 @@
}
void AnnotWidget::generateFieldAppearance() {
- Object appearDict, obj1, obj2;
GfxResources *resources;
- MemStream *appearStream;
GooString *da;
appearBuf = new GooString ();
@@ -5084,28 +4898,26 @@
}
// build the appearance stream dictionary
- appearDict.initDict(xref);
- appearDict.dictAdd(copyString("Length"),
- obj1.initInt(appearBuf->getLength()));
- appearDict.dictAdd(copyString("Subtype"), obj1.initName("Form"));
- obj1.initArray(xref);
- obj1.arrayAdd(obj2.initReal(0));
- obj1.arrayAdd(obj2.initReal(0));
- obj1.arrayAdd(obj2.initReal(rect->x2 - rect->x1));
- obj1.arrayAdd(obj2.initReal(rect->y2 - rect->y1));
- appearDict.dictAdd(copyString("BBox"), &obj1);
+ Dict *appearDict = new Dict(xref);
+ appearDict->add(copyString("Length"), Object(appearBuf->getLength()));
+ appearDict->add(copyString("Subtype"), Object(objName, "Form"));
+ Array *bbox = new Array(xref);
+ bbox->add(Object(0));
+ bbox->add(Object(0));
+ bbox->add(Object(rect->x2 - rect->x1));
+ bbox->add(Object(rect->y2 - rect->y1));
+ appearDict->add(copyString("BBox"), Object(bbox));
// set the resource dictionary
Object *resDict = form->getDefaultResourcesObj();
if (resDict->isDict()) {
- appearDict.dictAdd(copyString("Resources"), resDict->copy(&obj1));
+ appearDict->add(copyString("Resources"), resDict->copy());
}
// build the appearance stream
- appearStream = new MemStream(copyString(appearBuf->getCString()), 0,
- appearBuf->getLength(), &appearDict);
- appearance.free();
- appearance.initStream(appearStream);
+ MemStream *appearStream = new MemStream(copyString(appearBuf->getCString()), 0,
+ appearBuf->getLength(), Object(appearDict));
+ appearance = Object(static_cast<Stream*>(appearStream));
delete appearBuf;
appearStream->setNeedFree(gTrue);
@@ -5128,8 +4940,7 @@
generateFieldAppearance();
// Fetch the appearance stream we've just created
- Object obj1;
- appearance.fetch(xref, &obj1);
+ Object obj1 = appearance.fetch(xref);
// If this the first time updateAppearanceStream() is called on this widget,
// create a new AP dictionary containing the new appearance stream.
@@ -5137,26 +4948,22 @@
if (updatedAppearanceStream.num == -1) {
// Write the appearance stream
updatedAppearanceStream = xref->addIndirectObject(&obj1);
- obj1.free();
// Write the AP dictionary
- Object obj2;
- obj1.initDict(xref);
- obj1.dictAdd(copyString("N"), obj2.initRef(updatedAppearanceStream.num, updatedAppearanceStream.gen));
- update("AP", &obj1);
+ obj1 = Object(new Dict(xref));
+ obj1.dictAdd(copyString("N"), Object(updatedAppearanceStream.num, updatedAppearanceStream.gen));
// Update our internal pointers to the appearance dictionary
appearStreams = new AnnotAppearance(doc, &obj1);
+
+ update("AP", std::move(obj1));
} else {
// Replace the existing appearance stream
xref->setModifiedObject(&obj1, updatedAppearanceStream);
- obj1.free();
}
}
void AnnotWidget::draw(Gfx *gfx, GBool printing) {
- Object obj;
-
if (!isVisible (printing))
return;
@@ -5172,29 +4979,19 @@
}
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ Object obj = appearance.fetch(gfx->getXRef());
if (addDingbatsResource) {
// We are forcing ZaDb but the font does not exist
// so create a fake one
- Object baseFontObj, subtypeObj;
- baseFontObj.initName("ZapfDingbats");
- subtypeObj.initName("Type1");
-
- Object fontDictObj;
Dict *fontDict = new Dict(gfx->getXRef());
- fontDict->decRef();
- fontDict->add(copyString("BaseFont"), &baseFontObj);
- fontDict->add(copyString("Subtype"), &subtypeObj);
- fontDictObj.initDict(fontDict);
+ fontDict->add(copyString("BaseFont"), Object(objName, "ZapfDingbats"));
+ fontDict->add(copyString("Subtype"), Object(objName, "Type1"));
- Object fontsDictObj;
Dict *fontsDict = new Dict(gfx->getXRef());
- fontsDict->decRef();
- fontsDict->add(copyString("ZaDb"), &fontDictObj);
- fontsDictObj.initDict(fontsDict);
+ fontsDict->add(copyString("ZaDb"), Object(fontDict));
Dict *dict = new Dict(gfx->getXRef());
- dict->add(copyString("Font"), &fontsDictObj);
+ dict->add(copyString("Font"), Object(fontsDict));
gfx->pushResources(dict);
delete dict;
}
@@ -5203,7 +5000,6 @@
if (addDingbatsResource) {
gfx->popResources();
}
- obj.free();
}
@@ -5215,7 +5011,7 @@
Object obj1;
type = typeMovie;
- annotObj.dictSet ("Subtype", obj1.initName ("Movie"));
+ annotObj.dictSet ("Subtype", Object(objName, "Movie"));
movie = movieA->copy();
// TODO: create movie dict from movieA
@@ -5223,10 +5019,10 @@
initialize(docA, annotObj.getDict());
}
-AnnotMovie::AnnotMovie(PDFDoc *docA, Dict *dict, Object *obj) :
- Annot(docA, dict, obj) {
+AnnotMovie::AnnotMovie(PDFDoc *docA, Object *dictObject, Object *obj) :
+ Annot(docA, dictObject, obj) {
type = typeMovie;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotMovie::~AnnotMovie() {
@@ -5238,17 +5034,16 @@
void AnnotMovie::initialize(PDFDoc *docA, Dict* dict) {
Object obj1;
- if (dict->lookup("T", &obj1)->isString()) {
+ obj1 = dict->lookup("T");
+ if (obj1.isString()) {
title = obj1.getString()->copy();
} else {
title = NULL;
}
- obj1.free();
- Object movieDict;
- if (dict->lookup("Movie", &movieDict)->isDict()) {
- Object obj2;
- dict->lookup("A", &obj2);
+ Object movieDict = dict->lookup("Movie");
+ if (movieDict.isDict()) {
+ Object obj2 = dict->lookup("A");
if (obj2.isDict())
movie = new Movie (&movieDict, &obj2);
else
@@ -5258,79 +5053,66 @@
movie = NULL;
ok = gFalse;
}
- obj2.free();
} else {
error(errSyntaxError, -1, "Bad Annot Movie");
movie = NULL;
ok = gFalse;
}
- movieDict.free();
}
void AnnotMovie::draw(Gfx *gfx, GBool printing) {
- Object obj;
-
if (!isVisible (printing))
return;
annotLocker();
if (appearance.isNull() && movie->getShowPoster()) {
int width, height;
- Object poster;
- movie->getPoster(&poster);
+ Object poster = movie->getPoster();
movie->getAspect(&width, &height);
if (width != -1 && height != -1 && !poster.isNone()) {
- MemStream *mStream;
-
appearBuf = new GooString ();
appearBuf->append ("q\n");
appearBuf->appendf ("{0:d} 0 0 {1:d} 0 0 cm\n", width, height);
appearBuf->append ("/MImg Do\n");
appearBuf->append ("Q\n");
- Object imgDict;
- imgDict.initDict(gfx->getXRef());
- imgDict.dictSet ("MImg", &poster);
+ Dict *imgDict = new Dict(gfx->getXRef());
+ imgDict->set("MImg", std::move(poster));
- Object resDict;
- resDict.initDict(gfx->getXRef());
- resDict.dictSet ("XObject", &imgDict);
+ Dict *resDict = new Dict(gfx->getXRef());
+ resDict->set("XObject", Object(imgDict));
- Object formDict, obj1, obj2;
- formDict.initDict(gfx->getXRef());
- formDict.dictSet("Length", obj1.initInt(appearBuf->getLength()));
- formDict.dictSet("Subtype", obj1.initName("Form"));
- formDict.dictSet("Name", obj1.initName("FRM"));
- obj1.initArray(gfx->getXRef());
- obj1.arrayAdd(obj2.initInt(0));
- obj1.arrayAdd(obj2.initInt(0));
- obj1.arrayAdd(obj2.initInt(width));
- obj1.arrayAdd(obj2.initInt(height));
- formDict.dictSet("BBox", &obj1);
- obj1.initArray(gfx->getXRef());
- obj1.arrayAdd(obj2.initInt(1));
- obj1.arrayAdd(obj2.initInt(0));
- obj1.arrayAdd(obj2.initInt(0));
- obj1.arrayAdd(obj2.initInt(1));
- obj1.arrayAdd(obj2.initInt(-width / 2));
- obj1.arrayAdd(obj2.initInt(-height / 2));
- formDict.dictSet("Matrix", &obj1);
- formDict.dictSet("Resources", &resDict);
+ Dict *formDict = new Dict(gfx->getXRef());
+ formDict->set("Length", Object(appearBuf->getLength()));
+ formDict->set("Subtype", Object(objName, "Form"));
+ formDict->set("Name", Object(objName, "FRM"));
+ Array *bboxArray = new Array(gfx->getXRef());
+ bboxArray->add(Object(0));
+ bboxArray->add(Object(0));
+ bboxArray->add(Object(width));
+ bboxArray->add(Object(height));
+ formDict->set("BBox", Object(bboxArray));
+ Array *matrix = new Array(gfx->getXRef());
+ matrix->add(Object(1));
+ matrix->add(Object(0));
+ matrix->add(Object(0));
+ matrix->add(Object(1));
+ matrix->add(Object(-width / 2));
+ matrix->add(Object(-height / 2));
+ formDict->set("Matrix", Object(matrix));
+ formDict->set("Resources", Object(resDict));
- Object aStream;
- mStream = new MemStream(copyString(appearBuf->getCString()), 0,
- appearBuf->getLength(), &formDict);
+ MemStream *mStream = new MemStream(copyString(appearBuf->getCString()), 0,
+ appearBuf->getLength(), Object(formDict));
mStream->setNeedFree(gTrue);
- aStream.initStream(mStream);
delete appearBuf;
- Object objDict;
- objDict.initDict(gfx->getXRef());
- objDict.dictSet ("FRM", &aStream);
+ Dict *dict = new Dict(gfx->getXRef());
+ dict->set("FRM", Object(static_cast<Stream*>(mStream)));
- resDict.initDict(gfx->getXRef());
- resDict.dictSet ("XObject", &objDict);
+ Dict *resDict2 = new Dict(gfx->getXRef());
+ resDict2->set("XObject", Object(dict));
appearBuf = new GooString ();
appearBuf->append ("q\n");
@@ -5346,17 +5128,15 @@
bbox[0] = bbox[1] = 0;
bbox[2] = width;
bbox[3] = height;
- createForm(bbox, gFalse, &resDict, &appearance);
+ appearance = createForm(bbox, gFalse, resDict2);
delete appearBuf;
}
- poster.free();
}
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ Object obj = appearance.fetch(gfx->getXRef());
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
- obj.free();
}
//------------------------------------------------------------------------
@@ -5368,38 +5148,34 @@
type = typeScreen;
- annotObj.dictSet ("Subtype", obj1.initName ("Screen"));
+ annotObj.dictSet ("Subtype", Object(objName, "Screen"));
initialize(docA, annotObj.getDict());
}
-AnnotScreen::AnnotScreen(PDFDoc *docA, Dict *dict, Object *obj) :
- Annot(docA, dict, obj) {
+AnnotScreen::AnnotScreen(PDFDoc *docA, Object *dictObject, Object *obj) :
+ Annot(docA, dictObject, obj) {
type = typeScreen;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotScreen::~AnnotScreen() {
- if (title)
- delete title;
- if (appearCharacs)
- delete appearCharacs;
- if (action)
- delete action;
-
- additionalActions.free();
+ delete title;
+ delete appearCharacs;
+ delete action;
}
void AnnotScreen::initialize(PDFDoc *docA, Dict* dict) {
Object obj1;
title = NULL;
- if (dict->lookup("T", &obj1)->isString()) {
+ obj1 = dict->lookup("T");
+ if (obj1.isString()) {
title = obj1.getString()->copy();
}
- obj1.free();
action = NULL;
- if (dict->lookup("A", &obj1)->isDict()) {
+ obj1 = dict->lookup("A");
+ if (obj1.isDict()) {
action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI());
if (action && action->getKind() == actionRendition && page == 0) {
error (errSyntaxError, -1, "Invalid Rendition action: associated screen annotation without P");
@@ -5408,15 +5184,14 @@
ok = gFalse;
}
}
- obj1.free();
- dict->lookupNF("AA", &additionalActions);
+ additionalActions = dict->lookupNF("AA");
appearCharacs = NULL;
- if(dict->lookup("MK", &obj1)->isDict()) {
+ obj1 = dict->lookup("MK");
+ if (obj1.isDict()) {
appearCharacs = new AnnotAppearanceCharacs(obj1.getDict());
}
- obj1.free();
}
LinkAction* AnnotScreen::getAdditionalAction(AdditionalActionsType type)
@@ -5435,14 +5210,14 @@
Object obj1;
type = typeStamp;
- annotObj.dictSet ("Subtype", obj1.initName ("Stamp"));
+ annotObj.dictSet ("Subtype", Object(objName, "Stamp"));
initialize(docA, annotObj.getDict());
}
-AnnotStamp::AnnotStamp(PDFDoc *docA, Dict *dict, Object *obj) :
- AnnotMarkup(docA, dict, obj) {
+AnnotStamp::AnnotStamp(PDFDoc *docA, Object *dictObject, Object *obj) :
+ AnnotMarkup(docA, dictObject, obj) {
type = typeStamp;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotStamp::~AnnotStamp() {
@@ -5450,14 +5225,12 @@
}
void AnnotStamp::initialize(PDFDoc *docA, Dict* dict) {
- Object obj1;
-
- if (dict->lookup("Name", &obj1)->isName()) {
+ Object obj1 = dict->lookup("Name");
+ if (obj1.isName()) {
icon = new GooString(obj1.getName());
} else {
icon = new GooString("Draft");
}
- obj1.free();
}
@@ -5470,9 +5243,7 @@
icon = new GooString();
}
- Object obj1;
- obj1.initName (icon->getCString());
- update("Name", &obj1);
+ update("Name", Object(objName, icon->getCString()));
invalidateAppearance();
}
@@ -5485,10 +5256,10 @@
switch (subType) {
case typeSquare:
- annotObj.dictSet ("Subtype", obj1.initName ("Square"));
+ annotObj.dictSet ("Subtype", Object(objName, "Square"));
break;
case typeCircle:
- annotObj.dictSet ("Subtype", obj1.initName ("Circle"));
+ annotObj.dictSet ("Subtype", Object(objName, "Circle"));
break;
default:
assert (0 && "Invalid subtype for AnnotGeometry\n");
@@ -5497,11 +5268,11 @@
initialize(docA, annotObj.getDict());
}
-AnnotGeometry::AnnotGeometry(PDFDoc *docA, Dict *dict, Object *obj) :
- AnnotMarkup(docA, dict, obj) {
+AnnotGeometry::AnnotGeometry(PDFDoc *docA, Object *dictObject, Object *obj) :
+ AnnotMarkup(docA, dictObject, obj) {
// the real type will be read in initialize()
type = typeSquare;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotGeometry::~AnnotGeometry() {
@@ -5513,7 +5284,8 @@
void AnnotGeometry::initialize(PDFDoc *docA, Dict* dict) {
Object obj1;
- if (dict->lookup("Subtype", &obj1)->isName()) {
+ obj1 = dict->lookup("Subtype");
+ if (obj1.isName()) {
GooString typeName(obj1.getName());
if (!typeName.cmp("Square")) {
type = typeSquare;
@@ -5521,54 +5293,52 @@
type = typeCircle;
}
}
- obj1.free();
- if (dict->lookup("IC", &obj1)->isArray()) {
+ obj1 = dict->lookup("IC");
+ if (obj1.isArray()) {
interiorColor = new AnnotColor(obj1.getArray());
} else {
interiorColor = NULL;
}
- obj1.free();
- if (dict->lookup("BS", &obj1)->isDict()) {
+ obj1 = dict->lookup("BS");
+ if (obj1.isDict()) {
delete border;
border = new AnnotBorderBS(obj1.getDict());
} else if (!border) {
border = new AnnotBorderBS();
}
- obj1.free();
- if (dict->lookup("BE", &obj1)->isDict()) {
+ obj1 = dict->lookup("BE");
+ if (obj1.isDict()) {
borderEffect = new AnnotBorderEffect(obj1.getDict());
} else {
borderEffect = NULL;
}
- obj1.free();
geometryRect = NULL;
- if (dict->lookup("RD", &obj1)->isArray()) {
+ obj1 = dict->lookup("RD");
+ if (obj1.isArray()) {
geometryRect = parseDiffRectangle(obj1.getArray(), rect);
}
- obj1.free();
-
}
void AnnotGeometry::setType(AnnotSubtype new_type) {
- Object obj1;
+ const char *typeName;
switch (new_type) {
case typeSquare:
- obj1.initName("Square");
+ typeName = "Square";
break;
case typeCircle:
- obj1.initName("Circle");
+ typeName = "Circle";
break;
default:
assert(!"Invalid subtype");
}
type = new_type;
- update("Subtype", &obj1);
+ update("Subtype", Object(objName, typeName));
invalidateAppearance();
}
@@ -5576,9 +5346,8 @@
delete interiorColor;
if (new_color) {
- Object obj1;
- new_color->writeToObject(xref, &obj1);
- update ("IC", &obj1);
+ Object obj1 = new_color->writeToObject(xref);
+ update ("IC", std::move(obj1));
interiorColor = new_color;
} else {
interiorColor = NULL;
@@ -5587,7 +5356,6 @@
}
void AnnotGeometry::draw(Gfx *gfx, GBool printing) {
- Object obj;
double ca = 1;
if (!isVisible (printing))
@@ -5673,26 +5441,22 @@
bbox[2] = rect->x2 - rect->x1;
bbox[3] = rect->y2 - rect->y1;
if (ca == 1) {
- createForm(bbox, gFalse, NULL, &appearance);
+ appearance = createForm(bbox, gFalse, nullptr);
} else {
- Object aStream;
-
- createForm(bbox, gTrue, NULL, &aStream);
+ Object aStream = createForm(bbox, gTrue, nullptr);
delete appearBuf;
- Object resDict;
appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
- createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
- createForm(bbox, gFalse, &resDict, &appearance);
+ Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
+ appearance = createForm(bbox, gFalse, resDict);
}
delete appearBuf;
}
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ Object obj = appearance.fetch(gfx->getXRef());
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
- obj.free();
}
//------------------------------------------------------------------------
@@ -5704,30 +5468,29 @@
switch (subType) {
case typePolygon:
- annotObj.dictSet ("Subtype", obj1.initName ("Polygon"));
+ annotObj.dictSet ("Subtype", Object(objName, "Polygon"));
break;
case typePolyLine:
- annotObj.dictSet ("Subtype", obj1.initName ("PolyLine"));
+ annotObj.dictSet ("Subtype", Object(objName, "PolyLine"));
break;
default:
assert (0 && "Invalid subtype for AnnotGeometry\n");
}
// Store dummy path with one null vertex only
- Object obj2, obj3;
- obj2.initArray (doc->getXRef());
- obj2.arrayAdd (obj3.initReal (0));
- obj2.arrayAdd (obj3.initReal (0));
- annotObj.dictSet ("Vertices", &obj2);
+ Array *a = new Array(doc->getXRef());
+ a->add(Object(0.));
+ a->add(Object(0.));
+ annotObj.dictSet("Vertices", Object(a));
initialize(docA, annotObj.getDict());
}
-AnnotPolygon::AnnotPolygon(PDFDoc *docA, Dict *dict, Object *obj) :
- AnnotMarkup(docA, dict, obj) {
+AnnotPolygon::AnnotPolygon(PDFDoc *docA, Object *dictObject, Object *obj) :
+ AnnotMarkup(docA, dictObject, obj) {
// the real type will be read in initialize()
type = typePolygon;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotPolygon::~AnnotPolygon() {
@@ -5743,7 +5506,8 @@
void AnnotPolygon::initialize(PDFDoc *docA, Dict* dict) {
Object obj1;
- if (dict->lookup("Subtype", &obj1)->isName()) {
+ obj1 = dict->lookup("Subtype");
+ if (obj1.isName()) {
GooString typeName(obj1.getName());
if (!typeName.cmp("Polygon")) {
type = typePolygon;
@@ -5751,60 +5515,58 @@
type = typePolyLine;
}
}
- obj1.free();
- if (dict->lookup("Vertices", &obj1)->isArray()) {
+ obj1 = dict->lookup("Vertices");
+ if (obj1.isArray()) {
vertices = new AnnotPath(obj1.getArray());
} else {
vertices = new AnnotPath();
error(errSyntaxError, -1, "Bad Annot Polygon Vertices");
ok = gFalse;
}
- obj1.free();
- if (dict->lookup("LE", &obj1)->isArray() && obj1.arrayGetLength() == 2) {
- Object obj2;
-
- if(obj1.arrayGet(0, &obj2)->isString())
+ obj1 = dict->lookup("LE");
+ if (obj1.isArray() && obj1.arrayGetLength() == 2) {
+ Object obj2 = obj1.arrayGet(0);
+ if(obj2.isString())
startStyle = parseAnnotLineEndingStyle(obj2.getString());
else
startStyle = annotLineEndingNone;
- obj2.free();
- if(obj1.arrayGet(1, &obj2)->isString())
+ obj2 = obj1.arrayGet(1);
+ if(obj2.isString())
endStyle = parseAnnotLineEndingStyle(obj2.getString());
else
endStyle = annotLineEndingNone;
- obj2.free();
} else {
startStyle = endStyle = annotLineEndingNone;
}
- obj1.free();
- if (dict->lookup("IC", &obj1)->isArray()) {
+ obj1 = dict->lookup("IC");
+ if (obj1.isArray()) {
interiorColor = new AnnotColor(obj1.getArray());
} else {
interiorColor = NULL;
}
- obj1.free();
- if (dict->lookup("BS", &obj1)->isDict()) {
+ obj1 = dict->lookup("BS");
+ if (obj1.isDict()) {
delete border;
border = new AnnotBorderBS(obj1.getDict());
} else if (!border) {
border = new AnnotBorderBS();
}
- obj1.free();
- if (dict->lookup("BE", &obj1)->isDict()) {
+ obj1 = dict->lookup("BE");
+ if (obj1.isDict()) {
borderEffect = new AnnotBorderEffect(obj1.getDict());
} else {
borderEffect = NULL;
}
- obj1.free();
- if (dict->lookup("IT", &obj1)->isName()) {
+ obj1 = dict->lookup("IT");
+ if (obj1.isName()) {
const char *intentName = obj1.getName();
if(!strcmp(intentName, "PolygonCloud")) {
@@ -5817,56 +5579,51 @@
} else {
intent = polygonCloud;
}
- obj1.free();
}
void AnnotPolygon::setType(AnnotSubtype new_type) {
- Object obj1;
+ const char *typeName;
switch (new_type) {
case typePolygon:
- obj1.initName("Polygon");
+ typeName = "Polygon";
break;
case typePolyLine:
- obj1.initName("PolyLine");
+ typeName = "PolyLine";
break;
default:
assert(!"Invalid subtype");
}
type = new_type;
- update("Subtype", &obj1);
+ update("Subtype", Object(objName, typeName));
invalidateAppearance();
}
void AnnotPolygon::setVertices(AnnotPath *path) {
- Object obj1, obj2;
delete vertices;
- obj1.initArray(xref);
-
+ Array *a = new Array(xref);
for (int i = 0; i < path->getCoordsLength(); i++) {
- obj1.arrayAdd (obj2.initReal (path->getX(i)));
- obj1.arrayAdd (obj2.initReal (path->getY(i)));
+ a->add(Object(path->getX(i)));
+ a->add(Object(path->getY(i)));
}
- vertices = new AnnotPath(obj1.getArray());
+ vertices = new AnnotPath(a);
- update("Vertices", &obj1);
+ update("Vertices", Object(a));
invalidateAppearance();
}
void AnnotPolygon::setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end) {
- Object obj1, obj2;
-
startStyle = start;
endStyle = end;
- obj1.initArray(xref);
- obj1.arrayAdd( obj2.initName(convertAnnotLineEndingStyle( startStyle )) );
- obj1.arrayAdd( obj2.initName(convertAnnotLineEndingStyle( endStyle )) );
+ Array *a = new Array(xref);
+ a->add( Object(objName, convertAnnotLineEndingStyle( startStyle )) );
+ a->add( Object(objName, convertAnnotLineEndingStyle( endStyle )) );
- update("LE", &obj1);
+ update("LE", Object(a));
invalidateAppearance();
}
@@ -5874,9 +5631,8 @@
delete interiorColor;
if (new_color) {
- Object obj1;
- new_color->writeToObject(xref, &obj1);
- update ("IC", &obj1);
+ Object obj1 = new_color->writeToObject(xref);
+ update ("IC", std::move(obj1));
interiorColor = new_color;
} else {
interiorColor = NULL;
@@ -5885,20 +5641,19 @@
}
void AnnotPolygon::setIntent(AnnotPolygonIntent new_intent) {
- Object obj1;
+ const char *intentName;
intent = new_intent;
if (new_intent == polygonCloud)
- obj1.initName("PolygonCloud");
+ intentName = "PolygonCloud";
else if (new_intent == polylineDimension)
- obj1.initName("PolyLineDimension");
+ intentName = "PolyLineDimension";
else // polygonDimension
- obj1.initName("PolygonDimension");
- update ("IT", &obj1);
+ intentName = "PolygonDimension";
+ update ("IT", Object(objName, intentName));
}
void AnnotPolygon::draw(Gfx *gfx, GBool printing) {
- Object obj;
double ca = 1;
if (!isVisible (printing))
@@ -5948,22 +5703,20 @@
double bbox[4];
appearBBox->getBBoxRect(bbox);
if (ca == 1) {
- createForm(bbox, gFalse, NULL, &appearance);
+ appearance = createForm(bbox, gFalse, nullptr);
} else {
- Object aStream, resDict;
-
- createForm(bbox, gTrue, NULL, &aStream);
+ Object aStream = createForm(bbox, gTrue, nullptr);
delete appearBuf;
appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
- createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
- createForm(bbox, gFalse, &resDict, &appearance);
+ Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
+ appearance = createForm(bbox, gFalse, resDict);
}
delete appearBuf;
}
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ Object obj = appearance.fetch(gfx->getXRef());
if (appearBBox) {
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
appearBBox->getPageXMin(), appearBBox->getPageYMin(),
@@ -5973,7 +5726,6 @@
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
}
- obj.free();
}
//------------------------------------------------------------------------
@@ -5985,14 +5737,14 @@
type = typeCaret;
- annotObj.dictSet ("Subtype", obj1.initName ("Caret"));
+ annotObj.dictSet ("Subtype", Object(objName, "Caret"));
initialize(docA, annotObj.getDict());
}
-AnnotCaret::AnnotCaret(PDFDoc *docA, Dict *dict, Object *obj) :
- AnnotMarkup(docA, dict, obj) {
+AnnotCaret::AnnotCaret(PDFDoc *docA, Object *dictObject, Object *obj) :
+ AnnotMarkup(docA, dictObject, obj) {
type = typeCaret;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotCaret::~AnnotCaret() {
@@ -6003,7 +5755,8 @@
Object obj1;
symbol = symbolNone;
- if (dict->lookup("Sy", &obj1)->isName()) {
+ obj1 = dict->lookup("Sy");
+ if (obj1.isName()) {
GooString typeName(obj1.getName());
if (!typeName.cmp("P")) {
symbol = symbolP;
@@ -6011,22 +5764,18 @@
symbol = symbolNone;
}
}
- obj1.free();
- if (dict->lookup("RD", &obj1)->isArray()) {
+ obj1 = dict->lookup("RD");
+ if (obj1.isArray()) {
caretRect = parseDiffRectangle(obj1.getArray(), rect);
} else {
caretRect = NULL;
}
- obj1.free();
-
}
void AnnotCaret::setSymbol(AnnotCaretSymbol new_symbol) {
- Object obj1;
- obj1.initName( new_symbol == symbolP ? "P" : "None" );
symbol = new_symbol;
- update("Sy", &obj1);
+ update("Sy", Object(objName, new_symbol == symbolP ? "P" : "None"));
invalidateAppearance();
}
@@ -6039,23 +5788,24 @@
type = typeInk;
- annotObj.dictSet ("Subtype", obj1.initName ("Ink"));
+ annotObj.dictSet ("Subtype", Object(objName, "Ink"));
// Store dummy path with one null vertex only
- Object obj2, obj3, obj4;
- obj2.initArray (doc->getXRef());
- obj2.arrayAdd (obj3.initArray (doc->getXRef()));
- obj3.arrayAdd (obj4.initReal (0));
- obj3.arrayAdd (obj4.initReal (0));
- annotObj.dictSet ("InkList", &obj2);
+ Object obj3, obj4;
+ Array *inkList = new Array(doc->getXRef());
+ Array *vList = new Array(doc->getXRef());
+ vList->add(Object(0.));
+ vList->add(Object(0.));
+ inkList->add(Object(vList));
+ annotObj.dictSet("InkList", Object(inkList));
initialize(docA, annotObj.getDict());
}
-AnnotInk::AnnotInk(PDFDoc *docA, Dict *dict, Object *obj) :
- AnnotMarkup(docA, dict, obj) {
+AnnotInk::AnnotInk(PDFDoc *docA, Object *dictObject, Object *obj) :
+ AnnotMarkup(docA, dictObject, obj) {
type = typeInk;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotInk::~AnnotInk() {
@@ -6065,7 +5815,8 @@
void AnnotInk::initialize(PDFDoc *docA, Dict* dict) {
Object obj1;
- if (dict->lookup("InkList", &obj1)->isArray()) {
+ obj1 = dict->lookup("InkList");
+ if (obj1.isArray()) {
parseInkList(obj1.getArray());
} else {
inkListLength = 0;
@@ -6073,27 +5824,25 @@
error(errSyntaxError, -1, "Bad Annot Ink List");
ok = gFalse;
}
- obj1.free();
- if (dict->lookup("BS", &obj1)->isDict()) {
+ obj1 = dict->lookup("BS");
+ if (obj1.isDict()) {
delete border;
border = new AnnotBorderBS(obj1.getDict());
} else if (!border) {
border = new AnnotBorderBS();
}
- obj1.free();
}
void AnnotInk::writeInkList(AnnotPath **paths, int n_paths, Array *dest_array) {
- Object obj1, obj2;
for (int i = 0; i < n_paths; ++i) {
AnnotPath *path = paths[i];
- obj1.initArray (xref);
+ Array *a = new Array(xref);
for (int j = 0; j < path->getCoordsLength(); ++j) {
- obj1.arrayAdd (obj2.initReal (path->getX(j)));
- obj1.arrayAdd (obj2.initReal (path->getY(j)));
+ a->add(Object(path->getX(j)));
+ a->add(Object(path->getY(j)));
}
- dest_array->add (&obj1);
+ dest_array->add(Object(a));
}
}
@@ -6102,10 +5851,9 @@
inkList = (AnnotPath **) gmallocn ((inkListLength), sizeof(AnnotPath *));
memset(inkList, 0, inkListLength * sizeof(AnnotPath *));
for (int i = 0; i < inkListLength; i++) {
- Object obj2;
- if (array->get(i, &obj2)->isArray())
+ Object obj2 = array->get(i);
+ if (obj2.isArray())
inkList[i] = new AnnotPath(obj2.getArray());
- obj2.free();
}
}
@@ -6118,20 +5866,17 @@
}
void AnnotInk::setInkList(AnnotPath **paths, int n_paths) {
- Object obj1;
-
freeInkList();
- obj1.initArray (xref);
- writeInkList(paths, n_paths, obj1.getArray());
+ Array *a = new Array(xref);
+ writeInkList(paths, n_paths, a);
- parseInkList(obj1.getArray());
- annotObj.dictSet ("InkList", &obj1);
+ parseInkList(a);
+ annotObj.dictSet ("InkList", Object(a));
invalidateAppearance();
}
void AnnotInk::draw(Gfx *gfx, GBool printing) {
- Object obj;
double ca = 1;
if (!isVisible (printing))
@@ -6172,22 +5917,20 @@
double bbox[4];
appearBBox->getBBoxRect(bbox);
if (ca == 1) {
- createForm(bbox, gFalse, NULL, &appearance);
+ appearance = createForm(bbox, gFalse, nullptr);
} else {
- Object aStream, resDict;
-
- createForm(bbox, gTrue, NULL, &aStream);
+ Object aStream = createForm(bbox, gTrue, nullptr);
delete appearBuf;
appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
- createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
- createForm(bbox, gFalse, &resDict, &appearance);
+ Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
+ appearance = createForm(bbox, gFalse, resDict);
}
delete appearBuf;
}
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ Object obj = appearance.fetch(gfx->getXRef());
if (appearBBox) {
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
appearBBox->getPageXMin(), appearBBox->getPageYMin(),
@@ -6197,7 +5940,6 @@
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
}
- obj.free();
}
//------------------------------------------------------------------------
@@ -6209,45 +5951,39 @@
type = typeFileAttachment;
- annotObj.dictSet ("Subtype", obj1.initName ("FileAttachment"));
-
- Object obj2;
- obj2.initString(filename->copy());
- annotObj.dictSet ("FS", &obj2);
+ annotObj.dictSet("Subtype", Object(objName, "FileAttachment"));
+ annotObj.dictSet("FS", Object(filename->copy()));
initialize(docA, annotObj.getDict());
}
-AnnotFileAttachment::AnnotFileAttachment(PDFDoc *docA, Dict *dict, Object *obj) :
- AnnotMarkup(docA, dict, obj) {
+AnnotFileAttachment::AnnotFileAttachment(PDFDoc *docA, Object *dictObject, Object *obj) :
+ AnnotMarkup(docA, dictObject, obj) {
type = typeFileAttachment;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotFileAttachment::~AnnotFileAttachment() {
- file.free();
-
- if (name)
- delete name;
+ delete name;
}
void AnnotFileAttachment::initialize(PDFDoc *docA, Dict* dict) {
Object obj1;
- if (dict->lookup("FS", &obj1)->isDict() || dict->lookup("FS", &obj1)->isString()) {
- obj1.copy(&file);
+ obj1 = dict->lookup("FS");
+ if (obj1.isDict() || obj1.isString()) {
+ file = obj1.copy();
} else {
error(errSyntaxError, -1, "Bad Annot File Attachment");
ok = gFalse;
}
- obj1.free();
- if (dict->lookup("Name", &obj1)->isName()) {
+ obj1 = dict->lookup("Name");
+ if (obj1.isName()) {
name = new GooString(obj1.getName());
} else {
name = new GooString("PushPin");
}
- obj1.free();
}
#define ANNOT_FILE_ATTACHMENT_AP_PUSHPIN \
@@ -6363,7 +6099,6 @@
"19.5 17.699 20.91 17.418 22.5 17.5 c S\n"
void AnnotFileAttachment::draw(Gfx *gfx, GBool printing) {
- Object obj;
double ca = 1;
if (!isVisible (printing))
@@ -6394,26 +6129,22 @@
bbox[0] = bbox[1] = 0;
bbox[2] = bbox[3] = 24;
if (ca == 1) {
- createForm (bbox, gFalse, NULL, &appearance);
+ appearance = createForm (bbox, gFalse, nullptr);
} else {
- Object aStream;
-
- createForm (bbox, gTrue, NULL, &aStream);
+ Object aStream = createForm (bbox, gTrue, nullptr);
delete appearBuf;
- Object resDict;
appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
- createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
- createForm(bbox, gFalse, &resDict, &appearance);
+ Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
+ appearance = createForm(bbox, gFalse, resDict);
}
delete appearBuf;
}
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ Object obj = appearance.fetch(gfx->getXRef());
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
- obj.free();
}
//------------------------------------------------------------------------
@@ -6425,21 +6156,16 @@
type = typeSound;
- annotObj.dictSet ("Subtype", obj1.initName ("Sound"));
-
- Object obj2;
- Stream *str = soundA->getStream();
- obj2.initStream (str);
- str->incRef(); //FIXME: initStream should do this?
- annotObj.dictSet ("Sound", &obj2);
+ annotObj.dictSet ("Subtype", Object(objName, "Sound"));
+ annotObj.dictSet ("Sound", soundA->getObject()->copy());
initialize(docA, annotObj.getDict());
}
-AnnotSound::AnnotSound(PDFDoc *docA, Dict *dict, Object *obj) :
- AnnotMarkup(docA, dict, obj) {
+AnnotSound::AnnotSound(PDFDoc *docA, Object *dictObject, Object *obj) :
+ AnnotMarkup(docA, dictObject, obj) {
type = typeSound;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotSound::~AnnotSound() {
@@ -6449,21 +6175,20 @@
}
void AnnotSound::initialize(PDFDoc *docA, Dict* dict) {
- Object obj1;
+ Object obj1 = dict->lookup("Sound");
- sound = Sound::parseSound(dict->lookup("Sound", &obj1));
+ sound = Sound::parseSound(&obj1);
if (!sound) {
error(errSyntaxError, -1, "Bad Annot Sound");
ok = gFalse;
}
- obj1.free();
- if (dict->lookup("Name", &obj1)->isName()) {
+ obj1 = dict->lookup("Name");
+ if (obj1.isName()) {
name = new GooString(obj1.getName());
} else {
name = new GooString("Speaker");
}
- obj1.free();
}
#define ANNOT_SOUND_AP_SPEAKER \
@@ -6557,25 +6282,22 @@
bbox[0] = bbox[1] = 0;
bbox[2] = bbox[3] = 24;
if (ca == 1) {
- createForm(bbox, gFalse, NULL, &appearance);
+ appearance = createForm(bbox, gFalse, nullptr);
} else {
- Object aStream, resDict;
-
- createForm(bbox, gTrue, NULL, &aStream);
+ Object aStream = createForm(bbox, gTrue, nullptr);
delete appearBuf;
appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
- createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict);
- createForm(bbox, gFalse, &resDict, &appearance);
+ Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
+ appearance = createForm(bbox, gFalse, resDict);
}
delete appearBuf;
}
// draw the appearance stream
- appearance.fetch(gfx->getXRef(), &obj);
+ obj = appearance.fetch(gfx->getXRef());
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
- obj.free();
}
//------------------------------------------------------------------------
@@ -6587,15 +6309,15 @@
type = type3D;
- annotObj.dictSet ("Subtype", obj1.initName ("3D"));
+ annotObj.dictSet ("Subtype", Object(objName, "3D"));
initialize(docA, annotObj.getDict());
}
-Annot3D::Annot3D(PDFDoc *docA, Dict *dict, Object *obj) :
- Annot(docA, dict, obj) {
+Annot3D::Annot3D(PDFDoc *docA, Object *dictObject, Object *obj) :
+ Annot(docA, dictObject, obj) {
type = type3D;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
Annot3D::~Annot3D() {
@@ -6604,20 +6326,19 @@
}
void Annot3D::initialize(PDFDoc *docA, Dict* dict) {
- Object obj1;
-
- if (dict->lookup("3DA", &obj1)->isDict()) {
+ Object obj1 = dict->lookup("3DA");
+ if (obj1.isDict()) {
activation = new Activation(obj1.getDict());
} else {
activation = NULL;
}
- obj1.free();
}
Annot3D::Activation::Activation(Dict *dict) {
Object obj1;
- if (dict->lookup("A", &obj1)->isName()) {
+ obj1 = dict->lookup("A");
+ if (obj1.isName()) {
const char *name = obj1.getName();
if(!strcmp(name, "PO")) {
@@ -6632,9 +6353,9 @@
} else {
aTrigger = aTriggerUnknown;
}
- obj1.free();
- if(dict->lookup("AIS", &obj1)->isName()) {
+ obj1 = dict->lookup("AIS");
+ if (obj1.isName()) {
const char *name = obj1.getName();
if(!strcmp(name, "I")) {
@@ -6647,9 +6368,9 @@
} else {
aState = aStateUnknown;
}
- obj1.free();
- if(dict->lookup("D", &obj1)->isName()) {
+ obj1 = dict->lookup("D");
+ if (obj1.isName()) {
const char *name = obj1.getName();
if(!strcmp(name, "PC")) {
@@ -6664,9 +6385,9 @@
} else {
dTrigger = dTriggerUnknown;
}
- obj1.free();
- if(dict->lookup("DIS", &obj1)->isName()) {
+ obj1 = dict->lookup("DIS");
+ if (obj1.isName()) {
const char *name = obj1.getName();
if(!strcmp(name, "U")) {
@@ -6681,21 +6402,20 @@
} else {
dState = dStateUnknown;
}
- obj1.free();
- if (dict->lookup("TB", &obj1)->isBool()) {
+ obj1 = dict->lookup("TB");
+ if (obj1.isBool()) {
displayToolbar = obj1.getBool();
} else {
displayToolbar = gTrue;
}
- obj1.free();
- if (dict->lookup("NP", &obj1)->isBool()) {
+ obj1 = dict->lookup("NP");
+ if (obj1.isBool()) {
displayNavigation = obj1.getBool();
} else {
displayNavigation = gFalse;
}
- obj1.free();
}
//------------------------------------------------------------------------
@@ -6707,15 +6427,15 @@
type = typeRichMedia;
- annotObj.dictSet ("Subtype", obj1.initName ("RichMedia"));
+ annotObj.dictSet ("Subtype", Object(objName, "RichMedia"));
initialize(docA, annotObj.getDict());
}
-AnnotRichMedia::AnnotRichMedia(PDFDoc *docA, Dict *dict, Object *obj) :
- Annot(docA, dict, obj) {
+AnnotRichMedia::AnnotRichMedia(PDFDoc *docA, Object *dictObject, Object *obj) :
+ Annot(docA, dictObject, obj) {
type = typeRichMedia;
- initialize(docA, dict);
+ initialize(docA, dictObject->getDict());
}
AnnotRichMedia::~AnnotRichMedia() {
@@ -6724,21 +6444,19 @@
}
void AnnotRichMedia::initialize(PDFDoc *docA, Dict* dict) {
- Object obj1;
-
- if (dict->lookup("RichMediaContent", &obj1)->isDict()) {
+ Object obj1 = dict->lookup("RichMediaContent");
+ if (obj1.isDict()) {
content = new AnnotRichMedia::Content(obj1.getDict());
} else {
content = NULL;
}
- obj1.free();
- if (dict->lookup("RichMediaSettings", &obj1)->isDict()) {
+ obj1 = dict->lookup("RichMediaSettings");
+ if (obj1.isDict()) {
settings = new AnnotRichMedia::Settings(obj1.getDict());
} else {
settings = NULL;
}
- obj1.free();
}
AnnotRichMedia::Content* AnnotRichMedia::getContent() const {
@@ -6750,21 +6468,19 @@
}
AnnotRichMedia::Settings::Settings(Dict *dict) {
- Object obj1;
-
- if (dict->lookup("Activation", &obj1)->isDict()) {
+ Object obj1 = dict->lookup("Activation");
+ if (obj1.isDict()) {
activation = new AnnotRichMedia::Activation(obj1.getDict());
} else {
activation = NULL;
}
- obj1.free();
- if (dict->lookup("Deactivation", &obj1)->isDict()) {
+ obj1 = dict->lookup("Deactivation");
+ if (obj1.isDict()) {
deactivation = new AnnotRichMedia::Deactivation(obj1.getDict());
} else {
deactivation = NULL;
}
- obj1.free();
}
AnnotRichMedia::Settings::~Settings() {
@@ -6781,9 +6497,8 @@
}
AnnotRichMedia::Activation::Activation(Dict *dict) {
- Object obj1;
-
- if (dict->lookup("Condition", &obj1)->isName()) {
+ Object obj1 = dict->lookup("Condition");
+ if (obj1.isName()) {
const char *name = obj1.getName();
if (!strcmp(name, "PO")) {
@@ -6798,7 +6513,6 @@
} else {
condition = conditionUserAction;
}
- obj1.free();
}
AnnotRichMedia::Activation::Condition AnnotRichMedia::Activation::getCondition() const {
@@ -6806,9 +6520,8 @@
}
AnnotRichMedia::Deactivation::Deactivation(Dict *dict) {
- Object obj1;
-
- if (dict->lookup("Condition", &obj1)->isName()) {
+ Object obj1 = dict->lookup("Condition");
+ if (obj1.isName()) {
const char *name = obj1.getName();
if (!strcmp(name, "PC")) {
@@ -6823,7 +6536,6 @@
} else {
condition = conditionUserAction;
}
- obj1.free();
}
AnnotRichMedia::Deactivation::Condition AnnotRichMedia::Deactivation::getCondition() const {
@@ -6831,57 +6543,48 @@
}
AnnotRichMedia::Content::Content(Dict *dict) {
- Object obj1;
-
- if (dict->lookup("Configurations", &obj1)->isArray()) {
+ Object obj1 = dict->lookup("Configurations");
+ if (obj1.isArray()) {
nConfigurations = obj1.arrayGetLength();
configurations = (Configuration **)gmallocn(nConfigurations, sizeof(Configuration *));
for (int i = 0; i < nConfigurations; ++i) {
- Object obj2;
-
- if (obj1.arrayGet(i, &obj2)->isDict()) {
+ Object obj2 = obj1.arrayGet(i);
+ if (obj2.isDict()) {
configurations[i] = new AnnotRichMedia::Configuration(obj2.getDict());
} else {
configurations[i] = NULL;
}
- obj2.free();
}
} else {
nConfigurations = 0;
configurations = NULL;
}
- obj1.free();
nAssets = 0;
assets = NULL;
- if (dict->lookup("Assets", &obj1)->isDict()) {
- Object obj2;
-
- if (obj1.getDict()->lookup("Names", &obj2)->isArray()) {
+ obj1 = dict->lookup("Assets");
+ if (obj1.isDict()) {
+ Object obj2 = obj1.getDict()->lookup("Names");
+ if (obj2.isArray()) {
nAssets = obj2.arrayGetLength() / 2;
assets = (Asset **)gmallocn(nAssets, sizeof(Asset *));
int counter = 0;
for (int i = 0; i < obj2.arrayGetLength(); i += 2) {
- Object objKey;
-
assets[counter] = new AnnotRichMedia::Asset;
- obj2.arrayGet(i, &objKey);
- obj2.arrayGet(i + 1, &assets[counter]->fileSpec);
+ Object objKey = obj2.arrayGet(i);
+ assets[counter]->fileSpec = obj2.arrayGet(i + 1);
assets[counter]->name = new GooString( objKey.getString() );
++counter;
- objKey.free();
}
}
- obj2.free();
}
- obj1.free();
}
AnnotRichMedia::Content::~Content() {
@@ -6928,7 +6631,6 @@
AnnotRichMedia::Asset::~Asset()
{
delete name;
- fileSpec.free();
}
GooString* AnnotRichMedia::Asset::getName() const {
@@ -6941,36 +6643,33 @@
AnnotRichMedia::Configuration::Configuration(Dict *dict)
{
- Object obj1;
-
- if (dict->lookup("Instances", &obj1)->isArray()) {
+ Object obj1 = dict->lookup("Instances");
+ if (obj1.isArray()) {
nInstances = obj1.arrayGetLength();
instances = (Instance **)gmallocn(nInstances, sizeof(Instance *));
for (int i = 0; i < nInstances; ++i) {
- Object obj2;
-
- if (obj1.arrayGet(i, &obj2)->isDict()) {
+ Object obj2 = obj1.arrayGet(i);
+ if (obj2.isDict()) {
instances[i] = new AnnotRichMedia::Instance(obj2.getDict());
} else {
instances[i] = NULL;
}
- obj2.free();
}
} else {
instances = NULL;
}
- obj1.free();
- if (dict->lookup("Name", &obj1)->isString()) {
+ obj1 = dict->lookup("Name");
+ if (obj1.isString()) {
name = new GooString(obj1.getString());
} else {
name = NULL;
}
- obj1.free();
- if (dict->lookup("Subtype", &obj1)->isName()) {
+ obj1 = dict->lookup("Subtype");
+ if (obj1.isName()) {
const char *name = obj1.getName();
if (!strcmp(name, "3D")) {
@@ -7005,7 +6704,6 @@
}
}
}
- obj1.free();
}
AnnotRichMedia::Configuration::~Configuration()
@@ -7040,9 +6738,7 @@
AnnotRichMedia::Instance::Instance(Dict *dict)
{
- Object obj1;
-
- dict->lookup("Subtype", &obj1);
+ Object obj1 = dict->lookup("Subtype");
const char *name = obj1.isName() ? obj1.getName() : "";
if (!strcmp(name, "3D")) {
@@ -7056,14 +6752,13 @@
} else {
type = typeFlash;
}
- obj1.free();
- if (dict->lookup("Params", &obj1)->isDict()) {
+ obj1 = dict->lookup("Params");
+ if (obj1.isDict()) {
params = new AnnotRichMedia::Params(obj1.getDict());
} else {
params = NULL;
}
- obj1.free();
}
AnnotRichMedia::Instance::~Instance()
@@ -7081,14 +6776,12 @@
AnnotRichMedia::Params::Params(Dict *dict)
{
- Object obj1;
-
- if (dict->lookup("FlashVars", &obj1)->isString()) {
+ Object obj1 = dict->lookup("FlashVars");
+ if (obj1.isString()) {
flashVars = new GooString(obj1.getString());
} else {
flashVars = NULL;
}
- obj1.free();
}
AnnotRichMedia::Params::~Params()
@@ -7106,7 +6799,6 @@
Annots::Annots(PDFDoc *docA, int page, Object *annotsObj) {
Annot *annot;
- Object obj1;
int i;
doc = docA;
@@ -7119,10 +6811,10 @@
//get the Ref to this annot and pass it to Annot constructor
//this way, it'll be possible for the annot to retrieve the corresponding
//form widget
- Object obj2;
- if (annotsObj->arrayGet(i, &obj1)->isDict()) {
- annotsObj->arrayGetNF(i, &obj2);
- annot = createAnnot (obj1.getDict(), &obj2);
+ Object obj1 = annotsObj->arrayGet(i);
+ if (obj1.isDict()) {
+ Object obj2 = annotsObj->arrayGetNF(i);
+ annot = createAnnot (&obj1, &obj2);
if (annot) {
if (annot->isOk()) {
annot->setPage(page, gFalse); // Don't change /P
@@ -7131,8 +6823,6 @@
annot->decRefCnt();
}
}
- obj2.free();
- obj1.free();
}
}
}
@@ -7166,49 +6856,48 @@
}
}
-Annot *Annots::createAnnot(Dict* dict, Object *obj) {
- Annot *annot = NULL;
- Object obj1;
-
- if (dict->lookup("Subtype", &obj1)->isName()) {
+Annot *Annots::createAnnot(Object* dictObject, Object *obj) {
+ Annot *annot = nullptr;
+ Object obj1 = dictObject->dictLookup("Subtype");
+ if (obj1.isName()) {
const char *typeName = obj1.getName();
if (!strcmp(typeName, "Text")) {
- annot = new AnnotText(doc, dict, obj);
+ annot = new AnnotText(doc, dictObject, obj);
} else if (!strcmp(typeName, "Link")) {
- annot = new AnnotLink(doc, dict, obj);
+ annot = new AnnotLink(doc, dictObject, obj);
} else if (!strcmp(typeName, "FreeText")) {
- annot = new AnnotFreeText(doc, dict, obj);
+ annot = new AnnotFreeText(doc, dictObject, obj);
} else if (!strcmp(typeName, "Line")) {
- annot = new AnnotLine(doc, dict, obj);
+ annot = new AnnotLine(doc, dictObject, obj);
} else if (!strcmp(typeName, "Square")) {
- annot = new AnnotGeometry(doc, dict, obj);
+ annot = new AnnotGeometry(doc, dictObject, obj);
} else if (!strcmp(typeName, "Circle")) {
- annot = new AnnotGeometry(doc, dict, obj);
+ annot = new AnnotGeometry(doc, dictObject, obj);
} else if (!strcmp(typeName, "Polygon")) {
- annot = new AnnotPolygon(doc, dict, obj);
+ annot = new AnnotPolygon(doc, dictObject, obj);
} else if (!strcmp(typeName, "PolyLine")) {
- annot = new AnnotPolygon(doc, dict, obj);
+ annot = new AnnotPolygon(doc, dictObject, obj);
} else if (!strcmp(typeName, "Highlight")) {
- annot = new AnnotTextMarkup(doc, dict, obj);
+ annot = new AnnotTextMarkup(doc, dictObject, obj);
} else if (!strcmp(typeName, "Underline")) {
- annot = new AnnotTextMarkup(doc, dict, obj);
+ annot = new AnnotTextMarkup(doc, dictObject, obj);
} else if (!strcmp(typeName, "Squiggly")) {
- annot = new AnnotTextMarkup(doc, dict, obj);
+ annot = new AnnotTextMarkup(doc, dictObject, obj);
} else if (!strcmp(typeName, "StrikeOut")) {
- annot = new AnnotTextMarkup(doc, dict, obj);
+ annot = new AnnotTextMarkup(doc, dictObject, obj);
} else if (!strcmp(typeName, "Stamp")) {
- annot = new AnnotStamp(doc, dict, obj);
+ annot = new AnnotStamp(doc, dictObject, obj);
} else if (!strcmp(typeName, "Caret")) {
- annot = new AnnotCaret(doc, dict, obj);
+ annot = new AnnotCaret(doc, dictObject, obj);
} else if (!strcmp(typeName, "Ink")) {
- annot = new AnnotInk(doc, dict, obj);
+ annot = new AnnotInk(doc, dictObject, obj);
} else if (!strcmp(typeName, "FileAttachment")) {
- annot = new AnnotFileAttachment(doc, dict, obj);
+ annot = new AnnotFileAttachment(doc, dictObject, obj);
} else if (!strcmp(typeName, "Sound")) {
- annot = new AnnotSound(doc, dict, obj);
+ annot = new AnnotSound(doc, dictObject, obj);
} else if(!strcmp(typeName, "Movie")) {
- annot = new AnnotMovie(doc, dict, obj);
+ annot = new AnnotMovie(doc, dictObject, obj);
} else if(!strcmp(typeName, "Widget")) {
// Find the annot in forms
if (obj->isRef()) {
@@ -7222,37 +6911,33 @@
}
}
if (!annot)
- annot = new AnnotWidget(doc, dict, obj);
+ annot = new AnnotWidget(doc, dictObject, obj);
} else if(!strcmp(typeName, "Screen")) {
- annot = new AnnotScreen(doc, dict, obj);
+ annot = new AnnotScreen(doc, dictObject, obj);
} else if(!strcmp(typeName, "PrinterMark")) {
- annot = new Annot(doc, dict, obj);
+ annot = new Annot(doc, dictObject, obj);
} else if (!strcmp(typeName, "TrapNet")) {
- annot = new Annot(doc, dict, obj);
+ annot = new Annot(doc, dictObject, obj);
} else if (!strcmp(typeName, "Watermark")) {
- annot = new Annot(doc, dict, obj);
+ annot = new Annot(doc, dictObject, obj);
} else if (!strcmp(typeName, "3D")) {
- annot = new Annot3D(doc, dict, obj);
+ annot = new Annot3D(doc, dictObject, obj);
} else if (!strcmp(typeName, "RichMedia")) {
- annot = new AnnotRichMedia(doc, dict, obj);
+ annot = new AnnotRichMedia(doc, dictObject, obj);
} else if (!strcmp(typeName, "Popup")) {
/* Popup annots are already handled by markup annots
* Here we only care about popup annots without a
* markup annotation associated
*/
- Object obj2;
-
- if (dict->lookup("Parent", &obj2)->isNull())
- annot = new AnnotPopup(doc, dict, obj);
+ Object obj2 = dictObject->dictLookup("Parent");
+ if (obj2.isNull())
+ annot = new AnnotPopup(doc, dictObject, obj);
else
annot = NULL;
-
- obj2.free();
} else {
- annot = new Annot(doc, dict, obj);
+ annot = new Annot(doc, dictObject, obj);
}
}
- obj1.free();
return annot;
}
diff --git a/poppler/Annot.h b/poppler/Annot.h
index 87ba9c3..171494a 100644
--- a/poppler/Annot.h
+++ b/poppler/Annot.h
@@ -21,7 +21,7 @@
// Copyright (C) 2008 Hugo Mercier <hmercier31@gmail.com>
// Copyright (C) 2008 Pino Toscano <pino@kde.org>
// Copyright (C) 2008 Tomas Are Haavet <tomasare@gmail.com>
-// Copyright (C) 2009-2011, 2013, 2016 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009-2011, 2013, 2016, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it>
// Copyright (C) 2012, 2015 Tobias Koenig <tokoe@kdab.com>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
@@ -239,7 +239,7 @@
virtual double *getDash() const { return dash; }
virtual AnnotBorderStyle getStyle() const { return style; }
- virtual void writeToObject(XRef *xref, Object *obj1) const = 0;
+ virtual Object writeToObject(XRef *xref) const = 0;
protected:
AnnotBorder();
@@ -271,7 +271,7 @@
private:
AnnotBorderType getType() const override { return typeArray; }
- void writeToObject(XRef *xref, Object *obj1) const override;
+ Object writeToObject(XRef *xref) const override;
double horizontalCorner; // (Default 0)
double verticalCorner; // (Default 0)
@@ -290,7 +290,7 @@
private:
AnnotBorderType getType() const override { return typeBS; }
- void writeToObject(XRef *xref, Object *obj1) const override;
+ Object writeToObject(XRef *xref) const override;
const char *getStyleName() const;
@@ -324,7 +324,7 @@
AnnotColorSpace getSpace() const { return (AnnotColorSpace) length; }
const double *getValues() const { return values; }
- void writeToObject(XRef *xref, Object *dest) const;
+ Object writeToObject(XRef *xref) const;
private:
@@ -385,7 +385,7 @@
~AnnotAppearance();
// State is ignored if no subdictionary is present
- void getAppearanceStream(AnnotAppearanceType type, const char *state, Object *dest);
+ Object getAppearanceStream(AnnotAppearanceType type, const char *state);
// Access keys in normal appearance subdictionary (N)
GooString * getStateKey(int i);
@@ -555,8 +555,8 @@
};
Annot(PDFDoc *docA, PDFRectangle *rectA);
- Annot(PDFDoc *docA, Dict *dict);
- Annot(PDFDoc *docA, Dict *dict, Object *obj);
+ Annot(PDFDoc *docA, Object *dictObject);
+ Annot(PDFDoc *docA, Object *dictObject, Object *obj);
GBool isOk() { return ok; }
void incRefCnt();
@@ -564,7 +564,7 @@
virtual void draw(Gfx *gfx, GBool printing);
// Get the resource dict of the appearance stream
- virtual Object *getAppearanceResDict(Object *dest);
+ virtual Object getAppearanceResDict();
GBool match(Ref *refA)
{ return ref.num == refA->num && ref.gen == refA->gen; }
@@ -638,15 +638,15 @@
double *width, double widthLimit, int *charCount,
GBool noReencode);
void writeString(GooString *str, GooString *appearBuf);
- void createForm(double *bbox, GBool transparencyGroup, Object *resDict, Object *aStream);
- void createResourcesDict(const char *formName, Object *formStream, const char *stateName,
- double opacity, const char *blendMode, Object *resDict);
+ Object createForm(double *bbox, GBool transparencyGroup, Dict *resDict);
+ Dict *createResourcesDict(const char *formName, Object &&formStream, const char *stateName,
+ double opacity, const char *blendMode);
GBool isVisible(GBool printing);
int getRotation() const;
// Updates the field key of the annotation dictionary
// and sets M to the current time
- void update(const char *key, Object *value);
+ void update(const char *key, Object &&value);
// Delete appearance streams and reset appearance state
void invalidateAppearance();
@@ -695,10 +695,9 @@
class AnnotPopup: public Annot {
public:
AnnotPopup(PDFDoc *docA, PDFRectangle *rect);
- AnnotPopup(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotPopup(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotPopup();
- Object *getParent(Object *obj) { return parent.fetch (xref, obj); }
Object *getParentNF() { return &parent; }
void setParent(Object *parentA);
void setParent(Annot *parentA);
@@ -724,7 +723,7 @@
};
AnnotMarkup(PDFDoc *docA, PDFRectangle *rect);
- AnnotMarkup(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotMarkup(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotMarkup();
// getters
@@ -784,7 +783,7 @@
};
AnnotText(PDFDoc *docA, PDFRectangle *rect);
- AnnotText(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotText(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotText();
void draw(Gfx *gfx, GBool printing) override;
@@ -817,7 +816,7 @@
class AnnotMovie: public Annot {
public:
AnnotMovie(PDFDoc *docA, PDFRectangle *rect, Movie *movieA);
- AnnotMovie(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotMovie(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotMovie();
void draw(Gfx *gfx, GBool printing) override;
@@ -841,7 +840,7 @@
public:
AnnotScreen(PDFDoc *docA, PDFRectangle *rect);
- AnnotScreen(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotScreen(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotScreen();
GooString* getTitle() { return title; }
@@ -877,7 +876,7 @@
};
AnnotLink(PDFDoc *docA, PDFRectangle *rect);
- AnnotLink(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotLink(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotLink();
void draw(Gfx *gfx, GBool printing) override;
@@ -919,11 +918,11 @@
};
AnnotFreeText(PDFDoc *docA, PDFRectangle *rect, GooString *da);
- AnnotFreeText(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotFreeText(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotFreeText();
void draw(Gfx *gfx, GBool printing) override;
- Object *getAppearanceResDict(Object *dest) override;
+ Object getAppearanceResDict() override;
void setContents(GooString *new_content) override;
void setAppearanceString(GooString *new_string);
@@ -983,11 +982,11 @@
};
AnnotLine(PDFDoc *docA, PDFRectangle *rect);
- AnnotLine(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotLine(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotLine();
void draw(Gfx *gfx, GBool printing) override;
- Object *getAppearanceResDict(Object *dest) override;
+ Object getAppearanceResDict() override;
void setContents(GooString *new_content) override;
void setVertices(double x1, double y1, double x2, double y2);
@@ -1049,7 +1048,7 @@
public:
AnnotTextMarkup(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType);
- AnnotTextMarkup(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotTextMarkup(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotTextMarkup();
void draw(Gfx *gfx, GBool printing) override;
@@ -1076,7 +1075,7 @@
public:
AnnotStamp(PDFDoc *docA, PDFRectangle *rect);
- AnnotStamp(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotStamp(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotStamp();
void setIcon(GooString *new_icon);
@@ -1099,7 +1098,7 @@
public:
AnnotGeometry(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType);
- AnnotGeometry(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotGeometry(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotGeometry();
void draw(Gfx *gfx, GBool printing) override;
@@ -1135,7 +1134,7 @@
};
AnnotPolygon(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType);
- AnnotPolygon(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotPolygon(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotPolygon();
void draw(Gfx *gfx, GBool printing) override;
@@ -1185,7 +1184,7 @@
};
AnnotCaret(PDFDoc *docA, PDFRectangle *rect);
- AnnotCaret(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotCaret(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotCaret();
void setSymbol(AnnotCaretSymbol new_symbol);
@@ -1210,7 +1209,7 @@
public:
AnnotInk(PDFDoc *docA, PDFRectangle *rect);
- AnnotInk(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotInk(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotInk();
void draw(Gfx *gfx, GBool printing) override;
@@ -1245,7 +1244,7 @@
public:
AnnotFileAttachment(PDFDoc *docA, PDFRectangle *rect, GooString *filename);
- AnnotFileAttachment(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotFileAttachment(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotFileAttachment();
void draw(Gfx *gfx, GBool printing) override;
@@ -1273,7 +1272,7 @@
public:
AnnotSound(PDFDoc *docA, PDFRectangle *rect, Sound *soundA);
- AnnotSound(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotSound(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotSound();
void draw(Gfx *gfx, GBool printing) override;
@@ -1307,8 +1306,8 @@
highlightModePush // P,T
};
- AnnotWidget(PDFDoc *docA, Dict *dict, Object *obj);
- AnnotWidget(PDFDoc *docA, Dict *dict, Object *obj, FormField *fieldA);
+ AnnotWidget(PDFDoc *docA, Object *dictObject, Object *obj);
+ AnnotWidget(PDFDoc *docA, Object *dictObject, Object *obj, FormField *fieldA);
~AnnotWidget();
void draw(Gfx *gfx, GBool printing) override;
@@ -1398,7 +1397,7 @@
public:
Annot3D(PDFDoc *docA, PDFRectangle *rect);
- Annot3D(PDFDoc *docA, Dict *dict, Object *obj);
+ Annot3D(PDFDoc *docA, Object *dictObject, Object *obj);
~Annot3D();
// getters
@@ -1560,7 +1559,7 @@
};
AnnotRichMedia(PDFDoc *docA, PDFRectangle *rect);
- AnnotRichMedia(PDFDoc *docA, Dict *dict, Object *obj);
+ AnnotRichMedia(PDFDoc *docA, Object *dictObject, Object *obj);
~AnnotRichMedia();
Content* getContent() const;
@@ -1597,7 +1596,7 @@
GBool removeAnnot(Annot *annot);
private:
- Annot* createAnnot(Dict* dict, Object *obj);
+ Annot* createAnnot(Object* dictObject, Object *obj);
Annot *findAnnot(Ref *ref);
PDFDoc *doc;
diff --git a/poppler/Array.cc b/poppler/Array.cc
index 230c328..c2c4040 100644
--- a/poppler/Array.cc
+++ b/poppler/Array.cc
@@ -16,7 +16,7 @@
// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
-// Copyright (C) 2013 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2013, 2017 Albert Astals Cid <aacid@kde.org>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -65,14 +65,13 @@
#endif
}
-Object *Array::copy(XRef *xrefA, Object *obj) {
+Object Array::copy(XRef *xrefA) {
arrayLocker();
- obj->initArray(xrefA);
+ Array *a = new Array(xrefA);
for (int i = 0; i < length; ++i) {
- Object obj1;
- obj->arrayAdd(elems[i].copy(&obj1));
+ a->add(elems[i].copy());
}
- return obj;
+ return Object(a);
}
int Array::incRef() {
@@ -87,7 +86,7 @@
return ref;
}
-void Array::add(Object *elem) {
+void Array::add(Object &&elem) {
arrayLocker();
if (length == size) {
if (length == 0) {
@@ -97,7 +96,8 @@
}
elems = (Object *)greallocn(elems, size, sizeof(Object));
}
- elems[length] = *elem;
+ elems[length].initNullAfterMalloc();
+ elems[length] = std::move(elem);
++length;
}
@@ -114,39 +114,36 @@
memmove( elems + i, elems + i + 1, sizeof(elems[0]) * (length - i) );
}
-Object *Array::get(int i, Object *obj, int recursion) {
+Object Array::get(int i, int recursion) {
if (i < 0 || i >= length) {
#ifdef DEBUG_MEM
abort();
#else
- return obj->initNull();
+ return Object(objNull);
#endif
}
- return elems[i].fetch(xref, obj, recursion);
+ return elems[i].fetch(xref, recursion);
}
-Object *Array::getNF(int i, Object *obj) {
+Object Array::getNF(int i) {
if (i < 0 || i >= length) {
#ifdef DEBUG_MEM
abort();
#else
- return obj->initNull();
+ return Object(objNull);
#endif
}
- return elems[i].copy(obj);
+ return elems[i].copy();
}
GBool Array::getString(int i, GooString *string)
{
- Object obj;
-
- if (getNF(i, &obj)->isString()) {
+ Object obj = getNF(i);
+ if (obj.isString()) {
string->clear();
string->append(obj.getString());
- obj.free();
return gTrue;
} else {
- obj.free();
return gFalse;
}
}
diff --git a/poppler/Array.h b/poppler/Array.h
index e78e399..8043c83 100644
--- a/poppler/Array.h
+++ b/poppler/Array.h
@@ -16,6 +16,7 @@
// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
+// Copyright (C) 2017 Albert Astals Cid <aacid@kde.org>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -48,28 +49,30 @@
// Destructor.
~Array();
- // Reference counting.
- int incRef();
- int decRef();
-
// Get number of elements.
int getLength() { return length; }
// Copy array with new xref
- Object *copy(XRef *xrefA, Object *obj);
+ Object copy(XRef *xrefA);
- // Add an element.
- void add(Object *elem);
+ // Add an element
+ // elem becomes a dead object after this call
+ void add(Object &&elem);
// Remove an element by position
void remove(int i);
// Accessors.
- Object *get(int i, Object *obj, int resursion = 0);
- Object *getNF(int i, Object *obj);
+ Object get(int i, int resursion = 0);
+ Object getNF(int i);
GBool getString(int i, GooString *string);
private:
+ friend class Object; // for incRef/decRef
+
+ // Reference counting.
+ int incRef();
+ int decRef();
XRef *xref; // the xref table for this PDF file
Object *elems; // array of elements
diff --git a/poppler/CMap.cc b/poppler/CMap.cc
index 6731ab5..5ed8565 100644
--- a/poppler/CMap.cc
+++ b/poppler/CMap.cc
@@ -14,7 +14,7 @@
// under GPL version 2 or later
//
// Copyright (C) 2008 Koji Otani <sho@bbr.jp>
-// Copyright (C) 2008, 2009 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008, 2009, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2013 Fabio D'Urso <fabiodurso@hotmail.it>
//
// To see a description of the changes please see the Changelog file that
@@ -116,15 +116,11 @@
}
CMap *CMap::parse(CMapCache *cache, GooString *collectionA, Stream *str) {
- Object obj1;
- CMap *cMap;
-
- cMap = new CMap(collectionA->copy(), NULL);
-
- if (!str->getDict()->lookup("UseCMap", &obj1)->isNull()) {
+ CMap *cMap = new CMap(collectionA->copy(), NULL);
+ Object obj1 = str->getDict()->lookup("UseCMap");
+ if (!obj1.isNull()) {
cMap->useCMap(cache, &obj1);
}
- obj1.free();
str->reset();
cMap->parse2(cache, &getCharFromStream, str);
diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc
index 6676f89..b56d100 100644
--- a/poppler/CairoFontEngine.cc
+++ b/poppler/CairoFontEngine.cc
@@ -17,7 +17,7 @@
// Copyright (C) 2005-2007 Jeff Muizelaar <jeff@infidigm.net>
// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com>
// Copyright (C) 2005 Martin Kretzschmar <martink@gnome.org>
-// Copyright (C) 2005, 2009, 2012, 2013, 2015 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005, 2009, 2012, 2013, 2015, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2006, 2007, 2010, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright (C) 2007 Koji Otani <sho@bbr.jp>
// Copyright (C) 2008, 2009 Chris Wilson <chris@chris-wilson.co.uk>
@@ -708,7 +708,8 @@
output_dev->startDoc(info->doc, info->fontEngine);
output_dev->startPage (1, gfx->getState(), gfx->getXRef());
output_dev->setInType3Char(gTrue);
- gfx->display(charProcs->getVal(glyph, &charProc));
+ charProc = charProcs->getVal(glyph);
+ gfx->display(&charProc);
output_dev->getType3GlyphWidth (&wx, &wy);
cairo_matrix_transform_distance (&matrix, &wx, &wy);
@@ -727,7 +728,6 @@
delete gfx;
delete output_dev;
- charProc.free();
return CAIRO_STATUS_SUCCESS;
}
diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc
index 2946c92..9a2e053 100644
--- a/poppler/CairoOutputDev.cc
+++ b/poppler/CairoOutputDev.cc
@@ -16,7 +16,7 @@
//
// Copyright (C) 2005-2008 Jeff Muizelaar <jeff@infidigm.net>
// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com>
-// Copyright (C) 2005, 2009, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005, 2009, 2012, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2005 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
// Copyright (C) 2006-2011, 2013, 2014 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright (C) 2008 Carl Worth <cworth@cworth.org>
@@ -2956,9 +2956,8 @@
return;
}
- str->getDict()->lookup("ColorSpace", &obj);
+ obj = str->getDict()->lookup("ColorSpace");
colorSpace = GfxColorSpace::parse(NULL, &obj, this, state);
- obj.free();
// colorspace in stream dict may be different from colorspace in jpx
// data
diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc
index 0e37c84..6c820c6 100644
--- a/poppler/Catalog.cc
+++ b/poppler/Catalog.cc
@@ -14,7 +14,7 @@
// under GPL version 2 or later
//
// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
-// Copyright (C) 2005-2013, 2015 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005-2013, 2015, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2005 Jeff Muizelaar <jrmuizel@nit.ca>
// Copyright (C) 2005 Jonathan Blandford <jrb@redhat.com>
// Copyright (C) 2005 Marco Pesenti Gritti <mpg@redhat.com>
@@ -74,10 +74,6 @@
//------------------------------------------------------------------------
Catalog::Catalog(PDFDoc *docA) {
- Object catDict, pagesDict, pagesDictRef;
- Object obj, obj2;
- Object optContentProps;
-
#if MULTITHREADED
gInitMutex(&mutex);
#endif
@@ -107,44 +103,39 @@
lastCachedPage = 0;
markInfo = markInfoNull;
- xref->getCatalog(&catDict);
+ Object catDict = xref->getCatalog();
if (!catDict.isDict()) {
error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
- goto err1;
+ ok = gFalse;
+ return;
}
// get the AcroForm dictionary
- catDict.dictLookup("AcroForm", &acroForm);
+ acroForm = catDict.dictLookup("AcroForm");
// read base URI
- if (catDict.dictLookup("URI", &obj)->isDict()) {
- if (obj.dictLookup("Base", &obj2)->isString()) {
+ Object obj = catDict.dictLookup("URI");
+ if (obj.isDict()) {
+ Object obj2 = obj.dictLookup("Base");
+ if (obj2.isString()) {
baseURI = obj2.getString()->copy();
}
- obj2.free();
}
- obj.free();
// get the Optional Content dictionary
- if (catDict.dictLookup("OCProperties", &optContentProps)->isDict()) {
+ Object optContentProps = catDict.dictLookup("OCProperties");
+ if (optContentProps.isDict()) {
optContent = new OCGs(&optContentProps, xref);
if (!optContent->isOk ()) {
delete optContent;
optContent = NULL;
}
}
- optContentProps.free();
// actions
- catDict.dictLookupNF("AA", &additionalActions);
+ additionalActions = catDict.dictLookupNF("AA");
// get the ViewerPreferences dictionary
- catDict.dictLookup("ViewerPreferences", &viewerPreferences);
- catDict.free();
- return;
-
- err1:
- catDict.free();
- ok = gFalse;
+ viewerPreferences = catDict.dictLookup("ViewerPreferences");
}
Catalog::~Catalog() {
@@ -157,15 +148,7 @@
delete attrsList;
}
delete pagesRefList;
- if (pagesList) {
- std::vector<Dict *>::iterator it;
- for (it = pagesList->begin() ; it != pagesList->end(); ++it ) {
- if (!(*it)->decRef()) {
- delete *it;
- }
- }
- delete pagesList;
- }
+ delete pagesList;
if (pages) {
for (int i = 0; i < pagesSize; ++i) {
if (pages[i]) {
@@ -175,8 +158,6 @@
gfree(pages);
}
gfree(pageRefs);
- names.free();
- dests.free();
delete destNameTree;
delete embeddedFileNameTree;
delete jsNameTree;
@@ -188,45 +169,32 @@
delete optContent;
delete viewerPrefs;
delete structTreeRoot;
- metadata.free();
- outline.free();
- acroForm.free();
- viewerPreferences.free();
- additionalActions.free();
#if MULTITHREADED
gDestroyMutex(&mutex);
#endif
}
GooString *Catalog::readMetadata() {
- GooString *s;
- Dict *dict;
- Object obj;
-
catalogLocker();
if (metadata.isNone()) {
- Object catDict;
-
- xref->getCatalog(&catDict);
+ Object catDict = xref->getCatalog();
if (catDict.isDict()) {
- catDict.dictLookup("Metadata", &metadata);
+ metadata = catDict.dictLookup("Metadata");
} else {
error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
- metadata.initNull();
+ metadata.setToNull();
}
- catDict.free();
}
if (!metadata.isStream()) {
- return NULL;
+ return nullptr;
}
- dict = metadata.streamGetDict();
- if (!dict->lookup("Subtype", &obj)->isName("XML")) {
+ Object obj = metadata.streamGetDict()->lookup("Subtype");
+ if (!obj.isName("XML")) {
error(errSyntaxWarning, -1, "Unknown Metadata type: '{0:s}'",
obj.isName() ? obj.getName() : "???");
}
- obj.free();
- s = new GooString();
+ GooString *s = new GooString();
metadata.getStream()->fillGooString(s);
metadata.streamClose();
return s;
@@ -262,47 +230,32 @@
GBool Catalog::cachePageTree(int page)
{
- Dict *pagesDict;
-
if (pagesList == NULL) {
- Object catDict;
Ref pagesRef;
- xref->getCatalog(&catDict);
+ Object catDict = xref->getCatalog();
if (catDict.isDict()) {
- Object pagesDictRef;
- if (catDict.dictLookupNF("Pages", &pagesDictRef)->isRef() &&
+ Object pagesDictRef = catDict.dictLookupNF("Pages");
+ if (pagesDictRef.isRef() &&
pagesDictRef.getRefNum() >= 0 &&
pagesDictRef.getRefNum() < xref->getNumObjects()) {
pagesRef = pagesDictRef.getRef();
- pagesDictRef.free();
} else {
error(errSyntaxError, -1, "Catalog dictionary does not contain a valid \"Pages\" entry");
- pagesDictRef.free();
- catDict.free();
return gFalse;
}
} else {
error(errSyntaxError, -1, "Could not find catalog dictionary");
- catDict.free();
return gFalse;
}
- Object obj;
- catDict.dictLookup("Pages", &obj);
- catDict.free();
+ Object obj = catDict.dictLookup("Pages");
// This should really be isDict("Pages"), but I've seen at least one
// PDF file where the /Type entry is missing.
- if (obj.isDict()) {
- obj.getDict()->incRef();
- pagesDict = obj.getDict();
- obj.free();
- }
- else {
+ if (!obj.isDict()) {
error(errSyntaxError, -1, "Top-level pages object is wrong type ({0:s})", obj.getTypeName());
- obj.free();
return gFalse;
}
@@ -311,7 +264,6 @@
pageRefs = (Ref *)gmallocn_checkoverflow(pagesSize, sizeof(Ref));
if (pages == NULL || pageRefs == NULL ) {
error(errSyntaxError, -1, "Cannot allocate page cache");
- pagesDict->decRef();
pagesSize = 0;
return gFalse;
}
@@ -321,12 +273,12 @@
pageRefs[i].gen = -1;
}
- pagesList = new std::vector<Dict *>();
- pagesList->push_back(pagesDict);
+ attrsList = new std::vector<PageAttrs *>();
+ attrsList->push_back(new PageAttrs(NULL, obj.getDict()));
+ pagesList = new std::vector<Object>();
+ pagesList->push_back(std::move(obj));
pagesRefList = new std::vector<Ref>();
pagesRefList->push_back(pagesRef);
- attrsList = new std::vector<PageAttrs *>();
- attrsList->push_back(new PageAttrs(NULL, pagesDict));
kidsIdxList = new std::vector<int>();
kidsIdxList->push_back(0);
lastCachedPage = 0;
@@ -339,38 +291,29 @@
if (pagesList->empty()) return gFalse;
- pagesDict = pagesList->back();
- Object kids;
- pagesDict->lookup("Kids", &kids);
+ Object pagesDict = pagesList->back().copy();
+ Object kids = pagesDict.dictLookup("Kids");
if (!kids.isArray()) {
error(errSyntaxError, -1, "Kids object (page {0:d}) is wrong type ({1:s})",
lastCachedPage+1, kids.getTypeName());
- kids.free();
return gFalse;
}
int kidsIdx = kidsIdxList->back();
if (kidsIdx >= kids.arrayGetLength()) {
- if (!pagesList->back()->decRef()) {
- delete pagesList->back();
- }
pagesList->pop_back();
pagesRefList->pop_back();
delete attrsList->back();
attrsList->pop_back();
kidsIdxList->pop_back();
if (!kidsIdxList->empty()) kidsIdxList->back()++;
- kids.free();
continue;
}
- Object kidRef;
- kids.arrayGetNF(kidsIdx, &kidRef);
+ Object kidRef = kids.arrayGetNF(kidsIdx);
if (!kidRef.isRef()) {
error(errSyntaxError, -1, "Kid object (page {0:d}) is not an indirect reference ({1:s})",
lastCachedPage+1, kidRef.getTypeName());
- kidRef.free();
- kids.free();
return gFalse;
}
@@ -383,31 +326,23 @@
}
if (loop) {
error(errSyntaxError, -1, "Loop in Pages tree");
- kidRef.free();
- kids.free();
kidsIdxList->back()++;
continue;
}
- Object kid;
- kids.arrayGet(kidsIdx, &kid);
- kids.free();
+ Object kid = kids.arrayGet(kidsIdx);
if (kid.isDict("Page") || (kid.isDict() && !kid.getDict()->hasKey("Kids"))) {
PageAttrs *attrs = new PageAttrs(attrsList->back(), kid.getDict());
- Page *p = new Page(doc, lastCachedPage+1, kid.getDict(),
+ Page *p = new Page(doc, lastCachedPage+1, &kid,
kidRef.getRef(), attrs, form);
if (!p->isOk()) {
error(errSyntaxError, -1, "Failed to create page (page {0:d})", lastCachedPage+1);
delete p;
- kidRef.free();
- kid.free();
return gFalse;
}
if (lastCachedPage >= numPages) {
error(errSyntaxError, -1, "Page count in top-level pages object is incorrect");
- kidRef.free();
- kid.free();
return gFalse;
}
@@ -423,17 +358,13 @@
} else if (kid.isDict()) {
attrsList->push_back(new PageAttrs(attrsList->back(), kid.getDict()));
pagesRefList->push_back(kidRef.getRef());
- kid.getDict()->incRef();
- pagesList->push_back(kid.getDict());
+ pagesList->push_back(std::move(kid));
kidsIdxList->push_back(0);
} else {
error(errSyntaxError, -1, "Kid object (page {0:d}) is wrong type ({1:s})",
lastCachedPage+1, kid.getTypeName());
kidsIdxList->back()++;
}
- kidRef.free();
- kid.free();
-
}
return gFalse;
@@ -451,48 +382,28 @@
}
LinkDest *Catalog::findDest(GooString *name) {
- LinkDest *dest;
- Object obj1;
- GBool found;
-
// try named destination dictionary then name tree
- found = gFalse;
if (getDests()->isDict()) {
- if (!getDests()->dictLookup(name->getCString(), &obj1)->isNull())
- found = gTrue;
- else
- obj1.free();
+ Object obj1 = getDests()->dictLookup(name->getCString());
+ return createLinkDest(&obj1);
}
- if (!found) {
- catalogLocker();
- if (getDestNameTree()->lookup(name, &obj1))
- found = gTrue;
- else
- obj1.free();
- }
- if (!found)
- return NULL;
- dest = createLinkDest(&obj1);
- obj1.free();
-
- return dest;
+ catalogLocker();
+ Object obj2 = getDestNameTree()->lookup(name);
+ return createLinkDest(&obj2);
}
LinkDest *Catalog::createLinkDest(Object *obj)
{
- LinkDest *dest;
- Object obj2;
-
- dest = NULL;
+ LinkDest *dest = nullptr;
if (obj->isArray()) {
dest = new LinkDest(obj->getArray());
} else if (obj->isDict()) {
- if (obj->dictLookup("D", &obj2)->isArray())
+ Object obj2 = obj->dictLookup("D");
+ if (obj2.isArray())
dest = new LinkDest(obj2.getArray());
else
error(errSyntaxWarning, -1, "Bad named destination value");
- obj2.free();
} else {
error(errSyntaxWarning, -1, "Bad named destination value");
}
@@ -528,46 +439,37 @@
LinkDest *Catalog::getDestsDest(int i)
{
- LinkDest *dest;
- Object *obj, obj1;
-
- obj= getDests();
+ Object *obj = getDests();
if (!obj->isDict()) {
return NULL;
}
- obj->dictGetVal(i, &obj1);
- dest = createLinkDest(&obj1);
- obj1.free();
-
- return dest;
+ Object obj1 = obj->dictGetVal(i);
+ return createLinkDest(&obj1);
}
LinkDest *Catalog::getDestNameTreeDest(int i)
{
- LinkDest *dest;
Object obj;
catalogLocker();
- getDestNameTree()->getValue(i).fetch(xref, &obj);
- dest = createLinkDest(&obj);
- obj.free();
-
- return dest;
+ Object *aux = getDestNameTree()->getValue(i);
+ if (aux) {
+ obj = aux->fetch(xref);
+ }
+ return createLinkDest(&obj);
}
FileSpec *Catalog::embeddedFile(int i)
{
Object efDict;
- Object obj;
catalogLocker();
- obj = getEmbeddedFileNameTree()->getValue(i);
+ Object *obj = getEmbeddedFileNameTree()->getValue(i);
FileSpec *embeddedFile = 0;
- if (obj.isRef()) {
- Object fsDict;
- embeddedFile = new FileSpec(obj.fetch(xref, &fsDict));
- fsDict.free();
- } else if (obj.isDict()) {
- embeddedFile = new FileSpec(&obj);
+ if (obj->isRef()) {
+ Object fsDict = obj->fetch(xref);
+ embeddedFile = new FileSpec(&fsDict);
+ } else if (obj->isDict()) {
+ embeddedFile = new FileSpec(obj);
} else {
Object null;
embeddedFile = new FileSpec(&null);
@@ -581,26 +483,23 @@
// getJSNameTree()->getValue(i) returns a shallow copy of the object so we
// do not need to free it
catalogLocker();
- getJSNameTree()->getValue(i).fetch(xref, &obj);
+ Object *aux = getJSNameTree()->getValue(i);
+ if (aux) {
+ obj = aux->fetch(xref);
+ }
if (!obj.isDict()) {
- obj.free();
- return 0;
+ return nullptr;
}
- Object obj2;
- if (!obj.dictLookup("S", &obj2)->isName()) {
- obj2.free();
- obj.free();
- return 0;
+ Object obj2 = obj.dictLookup("S");
+ if (!obj2.isName()) {
+ return nullptr;
}
if (strcmp(obj2.getName(), "JavaScript")) {
- obj2.free();
- obj.free();
- return 0;
+ return nullptr;
}
- obj2.free();
- obj.dictLookup("JS", &obj2);
- GooString *js = 0;
+ obj2 = obj.dictLookup("JS");
+ GooString *js = nullptr;
if (obj2.isString()) {
js = new GooString(obj2.getString());
}
@@ -609,8 +508,6 @@
js = new GooString();
stream->fillGooString(js);
}
- obj2.free();
- obj.free();
return js;
}
@@ -619,18 +516,16 @@
catalogLocker();
if (pageMode == pageModeNull) {
- Object catDict, obj;
-
pageMode = pageModeNone;
- xref->getCatalog(&catDict);
+ Object catDict = xref->getCatalog();
if (!catDict.isDict()) {
error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
- catDict.free();
return pageMode;
}
- if (catDict.dictLookup("PageMode", &obj)->isName()) {
+ Object obj = catDict.dictLookup("PageMode");
+ if (obj.isName()) {
if (obj.isName("UseNone"))
pageMode = pageModeNone;
else if (obj.isName("UseOutlines"))
@@ -644,8 +539,6 @@
else if (obj.isName("UseAttachments"))
pageMode = pageModeAttach;
}
- obj.free();
- catDict.free();
}
return pageMode;
}
@@ -655,19 +548,17 @@
catalogLocker();
if (pageLayout == pageLayoutNull) {
- Object catDict, obj;
-
pageLayout = pageLayoutNone;
- xref->getCatalog(&catDict);
+ Object catDict = xref->getCatalog();
if (!catDict.isDict()) {
error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
- catDict.free();
return pageLayout;
}
pageLayout = pageLayoutNone;
- if (catDict.dictLookup("PageLayout", &obj)->isName()) {
+ Object obj = catDict.dictLookup("PageLayout");
+ if (obj.isName()) {
if (obj.isName("SinglePage"))
pageLayout = pageLayoutSinglePage;
if (obj.isName("OneColumn"))
@@ -681,8 +572,6 @@
if (obj.isName("TwoPageRight"))
pageLayout = pageLayoutTwoPageRight;
}
- obj.free();
- catDict.free();
}
return pageLayout;
}
@@ -705,20 +594,19 @@
}
NameTree::Entry::Entry(Array *array, int index) {
- if (!array->getString(index, &name) || !array->getNF(index + 1, &value)) {
- Object aux;
- array->get(index, &aux);
- if (aux.isString() && array->getNF(index + 1, &value) )
- {
- name.append(aux.getString());
- }
- else
- error(errSyntaxError, -1, "Invalid page tree");
+ if (!array->getString(index, &name)) {
+ Object aux = array->get(index);
+ if (aux.isString())
+ {
+ name.append(aux.getString());
}
+ else
+ error(errSyntaxError, -1, "Invalid page tree");
+ }
+ value = array->getNF(index + 1);
}
NameTree::Entry::~Entry() {
- value.free();
}
void NameTree::addEntry(Entry *entry)
@@ -753,33 +641,29 @@
}
void NameTree::parse(Object *tree) {
- Object names;
- Object kids, kid;
- int i;
-
if (!tree->isDict())
return;
// leaf node
- if (tree->dictLookup("Names", &names)->isArray()) {
- for (i = 0; i < names.arrayGetLength(); i += 2) {
+ Object names = tree->dictLookup("Names");
+ if (names.isArray()) {
+ for (int i = 0; i < names.arrayGetLength(); i += 2) {
NameTree::Entry *entry;
entry = new Entry(names.getArray(), i);
addEntry(entry);
}
}
- names.free();
// root or intermediate node
- if (tree->dictLookup("Kids", &kids)->isArray()) {
- for (i = 0; i < kids.arrayGetLength(); ++i) {
- if (kids.arrayGet(i, &kid)->isDict())
+ Object kids = tree->dictLookup("Kids");
+ if (kids.isArray()) {
+ for (int i = 0; i < kids.arrayGetLength(); ++i) {
+ Object kid = kids.arrayGet(i);
+ if (kid.isDict())
parse(&kid);
- kid.free();
}
}
- kids.free();
}
int NameTree::Entry::cmp(const void *voidKey, const void *voidEntry)
@@ -790,28 +674,26 @@
return key->cmp(&entry->name);
}
-GBool NameTree::lookup(GooString *name, Object *obj)
+Object NameTree::lookup(GooString *name)
{
Entry **entry;
entry = (Entry **) bsearch(name, entries,
length, sizeof(Entry *), Entry::cmp);
if (entry != NULL) {
- (*entry)->value.fetch(xref, obj);
- return gTrue;
+ return (*entry)->value.fetch(xref);
} else {
error(errSyntaxError, -1, "failed to look up ({0:s})", name->getCString());
- obj->initNull();
- return gFalse;
+ return Object(objNull);
}
}
-Object NameTree::getValue(int index)
+Object *NameTree::getValue(int index)
{
if (index < length) {
- return entries[index]->value;
+ return &entries[index]->value;
} else {
- return Object();
+ return nullptr;
}
}
@@ -866,39 +748,33 @@
catalogLocker();
if (numPages == -1)
{
- Object catDict, pagesDict, obj;
-
- xref->getCatalog(&catDict);
+ Object catDict = xref->getCatalog();
if (!catDict.isDict()) {
error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
- catDict.free();
return 0;
}
- catDict.dictLookup("Pages", &pagesDict);
+ Object pagesDict = catDict.dictLookup("Pages");
// This should really be isDict("Pages"), but I've seen at least one
// PDF file where the /Type entry is missing.
if (!pagesDict.isDict()) {
error(errSyntaxError, -1, "Top-level pages object is wrong type ({0:s})",
pagesDict.getTypeName());
- pagesDict.free();
- catDict.free();
return 0;
}
- pagesDict.dictLookup("Count", &obj);
+ Object obj = pagesDict.dictLookup("Count");
// some PDF files actually use real numbers here ("/Count 9.0")
if (!obj.isNum()) {
if (pagesDict.dictIs("Page")) {
- Object pageRootRef;
- catDict.dictLookupNF("Pages", &pageRootRef);
+ Object pageRootRef = catDict.dictLookupNF("Pages");
error(errSyntaxError, -1, "Pages top-level is a single Page. The document is malformed, trying to recover...");
Dict *pageDict = pagesDict.getDict();
if (pageRootRef.isRef()) {
const Ref pageRef = pageRootRef.getRef();
- Page *p = new Page(doc, 1, pageDict, pageRef, new PageAttrs(NULL, pageDict), form);
+ Page *p = new Page(doc, 1, &pagesDict, pageRef, new PageAttrs(NULL, pageDict), form);
if (p->isOk()) {
pages = (Page **)gmallocn(1, sizeof(Page *));
pageRefs = (Ref *)gmallocn(1, sizeof(Ref));
@@ -936,10 +812,6 @@
}
}
-
- catDict.free();
- obj.free();
- pagesDict.free();
}
return numPages;
@@ -949,21 +821,16 @@
{
catalogLocker();
if (!pageLabelInfo) {
- Object catDict;
- Object obj;
-
- xref->getCatalog(&catDict);
+ Object catDict = xref->getCatalog();
if (!catDict.isDict()) {
error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
- catDict.free();
- return NULL;
+ return nullptr;
}
- if (catDict.dictLookup("PageLabels", &obj)->isDict()) {
+ Object obj = catDict.dictLookup("PageLabels");
+ if (obj.isDict()) {
pageLabelInfo = new PageLabelInfo(&obj, getNumPages());
}
- obj.free();
- catDict.free();
}
return pageLabelInfo;
@@ -973,22 +840,16 @@
{
catalogLocker();
if (!structTreeRoot) {
- Object catalog;
- Object root;
-
- xref->getCatalog(&catalog);
+ Object catalog = xref->getCatalog();
if (!catalog.isDict()) {
error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catalog.getTypeName());
- catalog.free();
return NULL;
}
- if (catalog.dictLookup("StructTreeRoot", &root)->isDict("StructTreeRoot")) {
+ Object root = catalog.dictLookup("StructTreeRoot");
+ if (root.isDict("StructTreeRoot")) {
structTreeRoot = new StructTreeRoot(doc, root.getDict());
}
-
- root.free();
- catalog.free();
}
return structTreeRoot;
}
@@ -998,41 +859,35 @@
if (markInfo == markInfoNull) {
markInfo = 0;
- Object catDict;
catalogLocker();
- xref->getCatalog(&catDict);
+ Object catDict = xref->getCatalog();
if (catDict.isDict()) {
- Object markInfoDict;
- catDict.dictLookup("MarkInfo", &markInfoDict);
+ Object markInfoDict = catDict.dictLookup("MarkInfo");
if (markInfoDict.isDict()) {
- Object value;
-
- if (markInfoDict.dictLookup("Marked", &value)->isBool() && value.getBool())
+ Object value = markInfoDict.dictLookup("Marked");
+ if (value.isBool() && value.getBool())
markInfo |= markInfoMarked;
else if (!value.isNull())
error(errSyntaxError, -1, "Marked object is wrong type ({0:s})", value.getTypeName());
- value.free();
- if (markInfoDict.dictLookup("Suspects", &value)->isBool() && value.getBool())
+ value = markInfoDict.dictLookup("Suspects");
+ if (value.isBool() && value.getBool())
markInfo |= markInfoSuspects;
else if (!value.isNull())
error(errSyntaxError, -1, "Suspects object is wrong type ({0:s})", value.getTypeName());
- value.free();
- if (markInfoDict.dictLookup("UserProperties", &value)->isBool() && value.getBool())
+ value = markInfoDict.dictLookup("UserProperties");
+ if (value.isBool() && value.getBool())
markInfo |= markInfoUserProperties;
else if (!value.isNull())
error(errSyntaxError, -1, "UserProperties object is wrong type ({0:s})", value.getTypeName());
- value.free();
} else if (!markInfoDict.isNull()) {
error(errSyntaxError, -1, "MarkInfo object is wrong type ({0:s})", markInfoDict.getTypeName());
}
- markInfoDict.free();
} else {
error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
}
- catDict.free();
}
return markInfo;
}
@@ -1042,16 +897,13 @@
catalogLocker();
if (outline.isNone())
{
- Object catDict;
-
- xref->getCatalog(&catDict);
+ Object catDict = xref->getCatalog();
if (catDict.isDict()) {
- catDict.dictLookup("Outlines", &outline);
+ outline = catDict.dictLookup("Outlines");
} else {
error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
- outline.initNull();
+ outline.setToNull();
}
- catDict.free();
}
return &outline;
@@ -1062,16 +914,13 @@
catalogLocker();
if (dests.isNone())
{
- Object catDict;
-
- xref->getCatalog(&catDict);
+ Object catDict = xref->getCatalog();
if (catDict.isDict()) {
- catDict.dictLookup("Dests", &dests);
+ dests = catDict.dictLookup("Dests");
} else {
error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
- dests.initNull();
+ dests.setToNull();
}
- catDict.free();
}
return &dests;
@@ -1083,13 +932,12 @@
FormType res = NoForm;
if (acroForm.isDict()) {
- acroForm.dictLookup("XFA", &xfa);
+ xfa = acroForm.dictLookup("XFA");
if (xfa.isStream() || xfa.isArray()) {
res = XfaForm;
} else {
res = AcroForm;
}
- xfa.free();
}
return res;
@@ -1125,16 +973,13 @@
{
if (names.isNone())
{
- Object catDict;
-
- xref->getCatalog(&catDict);
+ Object catDict = xref->getCatalog();
if (catDict.isDict()) {
- catDict.dictLookup("Names", &names);
+ names = catDict.dictLookup("Names");
} else {
error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName());
- names.initNull();
+ names.setToNull();
}
- catDict.free();
}
return &names;
@@ -1147,11 +992,8 @@
destNameTree = new NameTree();
if (getNames()->isDict()) {
- Object obj;
-
- getNames()->dictLookup("Dests", &obj);
+ Object obj = getNames()->dictLookup("Dests");
destNameTree->init(xref, &obj);
- obj.free();
}
}
@@ -1166,11 +1008,8 @@
embeddedFileNameTree = new NameTree();
if (getNames()->isDict()) {
- Object obj;
-
- getNames()->dictLookup("EmbeddedFiles", &obj);
+ Object obj = getNames()->dictLookup("EmbeddedFiles");
embeddedFileNameTree->init(xref, &obj);
- obj.free();
}
}
@@ -1185,11 +1024,8 @@
jsNameTree = new NameTree();
if (getNames()->isDict()) {
- Object obj;
-
- getNames()->dictLookup("JavaScript", &obj);
+ Object obj = getNames()->dictLookup("JavaScript");
jsNameTree->init(xref, &obj);
- obj.free();
}
}
@@ -1198,24 +1034,18 @@
}
LinkAction* Catalog::getAdditionalAction(DocumentAdditionalActionsType type) {
- Object additionalActionsObject;
- LinkAction *linkAction = NULL;
-
- if (additionalActions.fetch(doc->getXRef(), &additionalActionsObject)->isDict()) {
+ LinkAction *linkAction = nullptr;
+ Object additionalActionsObject = additionalActions.fetch(doc->getXRef());
+ if (additionalActionsObject.isDict()) {
const char *key = (type == actionCloseDocument ? "WC" :
type == actionSaveDocumentStart ? "WS" :
type == actionSaveDocumentFinish ? "DS" :
type == actionPrintDocumentStart ? "WP" :
type == actionPrintDocumentFinish ? "DP" : NULL);
- Object actionObject;
-
- if (additionalActionsObject.dictLookup(key, &actionObject)->isDict())
+ Object actionObject = additionalActionsObject.dictLookup(key);
+ if (actionObject.isDict())
linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI());
- actionObject.free();
}
-
- additionalActionsObject.free();
-
return linkAction;
}
diff --git a/poppler/Catalog.h b/poppler/Catalog.h
index 81b0e12..c8b501a 100644
--- a/poppler/Catalog.h
+++ b/poppler/Catalog.h
@@ -14,7 +14,7 @@
// under GPL version 2 or later
//
// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
-// Copyright (C) 2005, 2007, 2009-2011, 2013 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005, 2007, 2009-2011, 2013, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2005 Jonathan Blandford <jrb@redhat.com>
// Copyright (C) 2005, 2006, 2008 Brad Hards <bradh@frogmouth.net>
// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
@@ -69,10 +69,10 @@
NameTree();
~NameTree();
void init(XRef *xref, Object *tree);
- GBool lookup(GooString *name, Object *obj);
+ Object lookup(GooString *name);
int numEntries() { return length; };
- // iterator accessor, note it returns a shallow copy, do not free the object
- Object getValue(int i);
+ // iterator accessor, note it returns a pointer to the internal object, do not free nor delete it
+ Object *getValue(int i);
GooString *getName(int i);
private:
@@ -248,7 +248,7 @@
Page **pages; // array of pages
Ref *pageRefs; // object ID for each page
int lastCachedPage;
- std::vector<Dict *> *pagesList;
+ std::vector<Object> *pagesList;
std::vector<Ref> *pagesRefList;
std::vector<PageAttrs *> *attrsList;
std::vector<int> *kidsIdxList;
diff --git a/poppler/CurlPDFDocBuilder.cc b/poppler/CurlPDFDocBuilder.cc
index 5b02b14..91d4c30 100644
--- a/poppler/CurlPDFDocBuilder.cc
+++ b/poppler/CurlPDFDocBuilder.cc
@@ -24,14 +24,11 @@
CurlPDFDocBuilder::buildPDFDoc(const GooString &uri,
GooString *ownerPassword, GooString *userPassword, void *guiDataA)
{
- Object obj;
-
CachedFile *cachedFile = new CachedFile(
new CurlCachedFileLoader(), uri.copy());
- obj.initNull();
BaseStream *str = new CachedFileStream(
- cachedFile, 0, gFalse, cachedFile->getLength(), &obj);
+ cachedFile, 0, gFalse, cachedFile->getLength(), Object(objNull));
return new PDFDoc(str, ownerPassword, userPassword, guiDataA);
}
diff --git a/poppler/DCTStream.cc b/poppler/DCTStream.cc
index bfdb0ea..b3e1303 100644
--- a/poppler/DCTStream.cc
+++ b/poppler/DCTStream.cc
@@ -5,7 +5,7 @@
// This file is licensed under the GPLv2 or later
//
// Copyright 2005 Jeff Muizelaar <jeff@infidigm.net>
-// Copyright 2005-2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright 2005-2010, 2012, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright 2009 Ryszard Trojnacki <rysiek@menel.com>
// Copyright 2010 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright 2011 Daiki Ueno <ueno@unixuser.org>
@@ -60,18 +60,14 @@
{
}
-DCTStream::DCTStream(Stream *strA, int colorXformA, Object *dict, int recursion) :
+DCTStream::DCTStream(Stream *strA, int colorXformA, Dict *dict, int recursion) :
FilterStream(strA) {
colorXform = colorXformA;
if (dict != NULL) {
- Object obj;
-
- dict->dictLookup("Width", &obj, recursion);
+ Object obj = dict->lookup("Width", recursion);
err.width = (obj.isInt() && obj.getInt() <= JPEG_MAX_DIMENSION) ? obj.getInt() : 0;
- obj.free();
- dict->dictLookup("Height", &obj, recursion);
+ obj = dict->lookup("Height", recursion);
err.height = (obj.isInt() && obj.getInt() <= JPEG_MAX_DIMENSION) ? obj.getInt() : 0;
- obj.free();
} else
err.height = err.width = 0;
init();
diff --git a/poppler/DCTStream.h b/poppler/DCTStream.h
index cfa0663..00e0484 100644
--- a/poppler/DCTStream.h
+++ b/poppler/DCTStream.h
@@ -6,7 +6,7 @@
//
// Copyright 2005 Jeff Muizelaar <jeff@infidigm.net>
// Copyright 2005 Martin Kretzschmar <martink@gnome.org>
-// Copyright 2005-2007, 2009-2011 Albert Astals Cid <aacid@kde.org>
+// Copyright 2005-2007, 2009-2011, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright 2010 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright 2011 Daiki Ueno <ueno@unixuser.org>
// Copyright 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
@@ -64,7 +64,7 @@
class DCTStream: public FilterStream {
public:
- DCTStream(Stream *strA, int colorXformA, Object *dict, int recursion);
+ DCTStream(Stream *strA, int colorXformA, Dict *dict, int recursion);
~DCTStream();
StreamKind getKind() override { return strDCT; }
void reset() override;
diff --git a/poppler/Dict.cc b/poppler/Dict.cc
index c2a94f4..5c231d1 100644
--- a/poppler/Dict.cc
+++ b/poppler/Dict.cc
@@ -16,7 +16,7 @@
// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
// Copyright (C) 2007-2008 Julien Rebetez <julienr@svn.gnome.org>
-// Copyright (C) 2008, 2010, 2013, 2014 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008, 2010, 2013, 2014, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2010 Paweł Wiejacha <pawel.wiejacha@gmail.com>
// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
@@ -98,7 +98,8 @@
entries = (DictEntry *)gmallocn(size, sizeof(DictEntry));
for (int i=0; i<length; i++) {
entries[i].key = copyString(dictA->entries[i].key);
- dictA->entries[i].val.copy(&entries[i].val);
+ entries[i].val.initNullAfterMalloc();
+ entries[i].val = dictA->entries[i].val.copy();
}
}
@@ -108,12 +109,8 @@
dictA->xref = xrefA;
for (int i=0; i<length; i++) {
if (dictA->entries[i].val.getType() == objDict) {
- Dict *dict = dictA->entries[i].val.getDict();
- Object obj;
- obj.initDict(dict->copy(xrefA));
- dictA->entries[i].val.free();
- dictA->entries[i].val = obj;
- obj.free();
+ Dict *copy = dictA->entries[i].val.getDict()->copy(xrefA);
+ dictA->entries[i].val = Object(copy);
}
}
return dictA;
@@ -144,7 +141,7 @@
return ref;
}
-void Dict::add(char *key, Object *val) {
+void Dict::add(char *key, Object &&val) {
dictLocker();
if (sorted) {
// We use add on very few occasions so
@@ -161,7 +158,8 @@
entries = (DictEntry *)greallocn(entries, size, sizeof(DictEntry));
}
entries[length].key = key;
- entries[length].val = *val;
+ entries[length].val.initNullAfterMalloc();
+ entries[length].val = std::move(val);
++length;
}
@@ -208,7 +206,6 @@
} else {
int i;
bool found = false;
- DictEntry tmp;
if(length == 0) {
return;
}
@@ -226,25 +223,26 @@
gfree(entries[i].key);
entries[i].val.free();
length -= 1;
- tmp = entries[length];
- if (i!=length) //don't copy the last entry if it is deleted
- entries[i] = tmp;
+ if (i!=length) {
+ //don't copy the last entry if it is deleted
+ entries[i].key = entries[length].key;
+ entries[i].val = std::move(entries[length].val);
+ }
}
}
-void Dict::set(const char *key, Object *val) {
+void Dict::set(const char *key, Object &&val) {
DictEntry *e;
- if (val->isNull()) {
+ if (val.isNull()) {
remove(key);
return;
}
e = find (key);
if (e) {
dictLocker();
- e->val.free();
- e->val = *val;
+ e->val = std::move(val);
} else {
- add (copyString(key), val);
+ add (copyString(key), std::move(val));
}
}
@@ -255,27 +253,25 @@
return (e = find("Type")) && e->val.isName(type);
}
-Object *Dict::lookup(const char *key, Object *obj, int recursion) {
+Object Dict::lookup(const char *key, int recursion) {
DictEntry *e;
- return (e = find(key)) ? e->val.fetch(xref, obj, recursion) : obj->initNull();
+ return (e = find(key)) ? e->val.fetch(xref, recursion) : Object(objNull);
}
-Object *Dict::lookupNF(const char *key, Object *obj) {
+Object Dict::lookupNF(const char *key) {
DictEntry *e;
- return (e = find(key)) ? e->val.copy(obj) : obj->initNull();
+ return (e = find(key)) ? e->val.copy() : Object(objNull);
}
GBool Dict::lookupInt(const char *key, const char *alt_key, int *value)
{
- Object obj1;
GBool success = gFalse;
-
- lookup ((char *) key, &obj1);
+ Object obj1 = lookup ((char *) key);
if (obj1.isNull () && alt_key != NULL) {
obj1.free ();
- lookup ((char *) alt_key, &obj1);
+ obj1 = lookup ((char *) alt_key);
}
if (obj1.isInt ()) {
*value = obj1.getInt ();
@@ -291,10 +287,10 @@
return entries[i].key;
}
-Object *Dict::getVal(int i, Object *obj) {
- return entries[i].val.fetch(xref, obj);
+Object Dict::getVal(int i) {
+ return entries[i].val.fetch(xref);
}
-Object *Dict::getValNF(int i, Object *obj) {
- return entries[i].val.copy(obj);
+Object Dict::getValNF(int i) {
+ return entries[i].val.copy();
}
diff --git a/poppler/Dict.h b/poppler/Dict.h
index fba99ed..b775a57 100644
--- a/poppler/Dict.h
+++ b/poppler/Dict.h
@@ -16,7 +16,7 @@
// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
// Copyright (C) 2007-2008 Julien Rebetez <julienr@svn.gnome.org>
-// Copyright (C) 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2010 Paweł Wiejacha <pawel.wiejacha@gmail.com>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
//
@@ -56,18 +56,16 @@
// Destructor.
~Dict();
- // Reference counting.
- int incRef();
- int decRef();
-
// Get number of entries.
int getLength() { return length; }
// Add an entry. NB: does not copy key.
- void add(char *key, Object *val);
+ // val becomes a dead object after the call
+ void add(char *key, Object &&val);
// Update the value of an existing entry, otherwise create it
- void set(const char *key, Object *val);
+ // val becomes a dead object after the call
+ void set(const char *key, Object &&val);
// Remove an entry. This invalidate indexes
void remove(const char *key);
@@ -76,14 +74,14 @@
// Look up an entry and return the value. Returns a null object
// if <key> is not in the dictionary.
- Object *lookup(const char *key, Object *obj, int recursion = 0);
- Object *lookupNF(const char *key, Object *obj);
+ Object lookup(const char *key, int recursion = 0);
+ Object lookupNF(const char *key);
GBool lookupInt(const char *key, const char *alt_key, int *value);
// Iterative accessors.
char *getKey(int i);
- Object *getVal(int i, Object *obj);
- Object *getValNF(int i, Object *obj);
+ Object getVal(int i);
+ Object getValNF(int i);
// Set the xref pointer. This is only used in one special case: the
// trailer dictionary, which is read before the xref table is
@@ -95,6 +93,11 @@
GBool hasKey(const char *key);
private:
+ friend class Object; // for incRef/decRef
+
+ // Reference counting.
+ int incRef();
+ int decRef();
GBool sorted;
XRef *xref; // the xref table for this PDF file
diff --git a/poppler/FileSpec.cc b/poppler/FileSpec.cc
index bac1eae..5ebef97 100644
--- a/poppler/FileSpec.cc
+++ b/poppler/FileSpec.cc
@@ -7,7 +7,7 @@
//
// Copyright (C) 2008-2009 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
-// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2012, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2012 Hib Eris <hib@hiberis.nl>
//
// To see a description of the changes please see the Changelog file that
@@ -35,40 +35,37 @@
m_checksum = NULL;
m_mimetype = NULL;
- efStream->copy(&m_objStr);
+ m_objStr = efStream->copy();
if (efStream->isStream()) {
// dataDict corresponds to Table 3.41 in the PDF1.6 spec.
Dict *dataDict = efStream->streamGetDict();
// subtype is normally the mimetype
- Object subtypeName;
- if (dataDict->lookup("Subtype", &subtypeName)->isName()) {
+ Object subtypeName = dataDict->lookup("Subtype");
+ if (subtypeName.isName()) {
m_mimetype = new GooString(subtypeName.getName());
}
- subtypeName.free();
// paramDict corresponds to Table 3.42 in the PDF1.6 spec
- Object paramDict;
- if (dataDict->lookup("Params", ¶mDict)->isDict()) {
- Object paramObj;
- if (paramDict.dictLookup("ModDate", ¶mObj)->isString())
+ Object paramDict = dataDict->lookup("Params");
+ if (paramDict.isDict()) {
+ Object paramObj = paramDict.dictLookup("ModDate");
+ if (paramObj.isString())
m_modDate = new GooString(paramObj.getString());
- paramObj.free();
- if (paramDict.dictLookup("CreationDate", ¶mObj)->isString())
+ paramObj = paramDict.dictLookup("CreationDate");
+ if (paramObj.isString())
m_createDate = new GooString(paramObj.getString());
- paramObj.free();
- if (paramDict.dictLookup("Size", ¶mObj)->isInt())
+ paramObj = paramDict.dictLookup("Size");
+ if (paramObj.isInt())
m_size = paramObj.getInt();
- paramObj.free();
- if (paramDict.dictLookup("CheckSum", ¶mObj)->isString())
+ paramObj = paramDict.dictLookup("CheckSum");
+ if (paramObj.isString())
m_checksum = new GooString(paramObj.getString());
- paramObj.free();
}
- paramDict.free();
}
}
@@ -78,7 +75,6 @@
delete m_modDate;
delete m_checksum;
delete m_mimetype;
- m_objStr.free();
}
GBool EmbFile::save(const char *path) {
@@ -110,41 +106,37 @@
platformFileName = NULL;
embFile = NULL;
desc = NULL;
- fileSpecA->copy(&fileSpec);
+ fileSpec = fileSpecA->copy();
- Object obj1;
- if (!getFileSpecName(fileSpecA, &obj1)) {
+ Object obj1 = getFileSpecName(fileSpecA);
+ if (!obj1.isString()) {
ok = gFalse;
- obj1.free();
error(errSyntaxError, -1, "Invalid FileSpec");
return;
}
fileName = obj1.getString()->copy();
- obj1.free();
if (fileSpec.isDict()) {
- if (fileSpec.dictLookup("EF", &obj1)->isDict()) {
- if (!obj1.dictLookupNF("F", &fileStream)->isRef()) {
+ obj1 = fileSpec.dictLookup("EF");
+ if (obj1.isDict()) {
+ fileStream = obj1.dictLookupNF("F");
+ if (!fileStream.isRef()) {
ok = gFalse;
- fileStream.free();
+ fileStream.setToNull();
error(errSyntaxError, -1, "Invalid FileSpec: Embedded file stream is not an indirect reference");
- obj1.free();
return;
}
}
- obj1.free();
}
- if (fileSpec.dictLookup("Desc", &obj1)->isString())
+ obj1 = fileSpec.dictLookup("Desc");
+ if (obj1.isString())
desc = obj1.getString()->copy();
- obj1.free();
}
FileSpec::~FileSpec()
{
- fileSpec.free();
- fileStream.free();
delete fileName;
delete platformFileName;
delete embFile;
@@ -161,8 +153,8 @@
Object obj1;
XRef *xref = fileSpec.getDict()->getXRef();
- embFile = new EmbFile(fileStream.fetch(xref, &obj1));
- obj1.free();
+ obj1 = fileStream.fetch(xref);
+ embFile = new EmbFile(&obj1);
return embFile;
}
@@ -172,84 +164,77 @@
if (platformFileName)
return platformFileName;
- Object obj1;
- if (getFileSpecNameForPlatform(&fileSpec, &obj1))
+ Object obj1 = getFileSpecNameForPlatform(&fileSpec);
+ if (obj1.isString())
platformFileName = obj1.getString()->copy();
- obj1.free();
return platformFileName;
}
-GBool getFileSpecName (Object *fileSpec, Object *fileName)
+Object getFileSpecName (Object *fileSpec)
{
if (fileSpec->isString()) {
- fileSpec->copy(fileName);
- return gTrue;
+ return fileSpec->copy();
}
if (fileSpec->isDict()) {
- fileSpec->dictLookup("UF", fileName);
- if (fileName->isString()) {
- return gTrue;
+ Object fileName = fileSpec->dictLookup("UF");
+ if (fileName.isString()) {
+ return fileName;
}
- fileName->free();
- fileSpec->dictLookup("F", fileName);
- if (fileName->isString()) {
- return gTrue;
+ fileName = fileSpec->dictLookup("F");
+ if (fileName.isString()) {
+ return fileName;
}
- fileName->free();
- fileSpec->dictLookup("DOS", fileName);
- if (fileName->isString()) {
- return gTrue;
+ fileName = fileSpec->dictLookup("DOS");
+ if (fileName.isString()) {
+ return fileName;
}
- fileName->free();
- fileSpec->dictLookup("Mac", fileName);
- if (fileName->isString()) {
- return gTrue;
+ fileName = fileSpec->dictLookup("Mac");
+ if (fileName.isString()) {
+ return fileName;
}
- fileName->free();
- fileSpec->dictLookup("Unix", fileName);
- if (fileName->isString()) {
- return gTrue;
+ fileName = fileSpec->dictLookup("Unix");
+ if (fileName.isString()) {
+ return fileName;
}
- fileName->free();
}
- return gFalse;
+ return Object();
}
-GBool getFileSpecNameForPlatform (Object *fileSpec, Object *fileName)
+Object getFileSpecNameForPlatform (Object *fileSpec)
{
if (fileSpec->isString()) {
- fileSpec->copy(fileName);
- return gTrue;
+ return fileSpec->copy();
}
+ Object fileName;
if (fileSpec->isDict()) {
- if (!fileSpec->dictLookup("UF", fileName)->isString ()) {
- fileName->free();
- if (!fileSpec->dictLookup("F", fileName)->isString ()) {
- fileName->free();
+ fileName = fileSpec->dictLookup("UF");
+ if (!fileName.isString ()) {
+ fileName = fileSpec->dictLookup("F");
+ if (!fileName.isString ()) {
#ifdef _WIN32
const char *platform = "DOS";
#else
const char *platform = "Unix";
#endif
- if (!fileSpec->dictLookup(platform, fileName)->isString ()) {
- fileName->free();
+ fileName = fileSpec->dictLookup(platform);
+ if (!fileName.isString ()) {
error(errSyntaxError, -1, "Illegal file spec");
- return gFalse;
+ return Object();
}
}
}
} else {
error(errSyntaxError, -1, "Illegal file spec");
- return gFalse;
+ return Object();
}
// system-dependent path manipulation
#ifdef _WIN32
int i, j;
- GooString *name = fileName->getString();
+ GooString *name = fileName.getString();
// "//...." --> "\...."
// "/x/...." --> "x:\...."
// "/server/share/...." --> "\\server\share\...."
@@ -291,5 +276,5 @@
}
#endif /* _WIN32 */
- return gTrue;
+ return fileName;
}
diff --git a/poppler/FileSpec.h b/poppler/FileSpec.h
index 9f2f6fc..6133117 100644
--- a/poppler/FileSpec.h
+++ b/poppler/FileSpec.h
@@ -6,6 +6,7 @@
// under GPL version 2 or later
//
// Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org>
+// Copyright (C) 2017 Albert Astals Cid <aacid@kde.org>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -31,6 +32,7 @@
GooString *createDate() { return m_createDate; }
GooString *checksum() { return m_checksum; }
GooString *mimeType() { return m_mimetype; }
+ Object *streamObject() { return &m_objStr; }
Stream *stream() { return isOk() ? m_objStr.getStream() : NULL; }
GBool isOk() { return m_objStr.isStream(); }
GBool save(const char *path);
@@ -70,7 +72,7 @@
GooString *desc; // Desc
};
-GBool getFileSpecName (Object *fileSpec, Object *fileName);
-GBool getFileSpecNameForPlatform (Object *fileSpec, Object *fileName);
+Object getFileSpecName (Object *fileSpec);
+Object getFileSpecNameForPlatform (Object *fileSpec);
#endif /* FILE_SPEC_H */
diff --git a/poppler/FontInfo.cc b/poppler/FontInfo.cc
index 8fc89e9..3730f52 100644
--- a/poppler/FontInfo.cc
+++ b/poppler/FontInfo.cc
@@ -3,7 +3,7 @@
// FontInfo.cc
//
// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com>
-// Copyright (C) 2005-2008, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005-2008, 2010, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
// Copyright (C) 2006 Kouhei Sutou <kou@cozmixng.org>
// Copyright (C) 2009 Pino Toscano <pino@kde.org>
@@ -54,7 +54,6 @@
Page *page;
Dict *resDict;
Annots *annots;
- Object obj1;
int lastPage;
if (currentPage > doc->getNumPages()) {
@@ -79,10 +78,10 @@
}
annots = page->getAnnots();
for (int i = 0; i < annots->getNumAnnots(); ++i) {
- if (annots->getAnnot(i)->getAppearanceResDict(&obj1)->isDict()) {
+ Object obj1 = annots->getAnnot(i)->getAppearanceResDict();
+ if (obj1.isDict()) {
scanFonts(xrefA, obj1.getDict(), result);
}
- obj1.free();
}
}
@@ -93,27 +92,24 @@
}
void FontInfoScanner::scanFonts(XRef *xrefA, Dict *resDict, GooList *fontsList) {
- Object obj1, obj2, objDict, resObj;
Ref r;
GfxFontDict *gfxFontDict;
GfxFont *font;
- int i;
// scan the fonts in this resource dictionary
gfxFontDict = NULL;
- resDict->lookupNF("Font", &obj1);
+ Object obj1 = resDict->lookupNF("Font");
if (obj1.isRef()) {
- obj1.fetch(xrefA, &obj2);
+ Object obj2 = obj1.fetch(xrefA);
if (obj2.isDict()) {
r = obj1.getRef();
gfxFontDict = new GfxFontDict(xrefA, &r, obj2.getDict());
}
- obj2.free();
} else if (obj1.isDict()) {
gfxFontDict = new GfxFontDict(xrefA, NULL, obj1.getDict());
}
if (gfxFontDict) {
- for (i = 0; i < gfxFontDict->getNumFonts(); ++i) {
+ for (int i = 0; i < gfxFontDict->getNumFonts(); ++i) {
if ((font = gfxFontDict->getFont(i))) {
Ref fontRef = *font->getID();
@@ -126,48 +122,39 @@
}
delete gfxFontDict;
}
- obj1.free();
// recursively scan any resource dictionaries in objects in this
// resource dictionary
const char *resTypes[] = { "XObject", "Pattern" };
for (Guint resType = 0; resType < sizeof(resTypes) / sizeof(resTypes[0]); ++resType) {
- resDict->lookup(resTypes[resType], &objDict);
+ Object objDict = resDict->lookup(resTypes[resType]);
if (objDict.isDict()) {
- for (i = 0; i < objDict.dictGetLength(); ++i) {
- objDict.dictGetValNF(i, &obj1);
+ for (int i = 0; i < objDict.dictGetLength(); ++i) {
+ obj1 = objDict.dictGetValNF(i);
if (obj1.isRef()) {
// check for an already-seen object
const Ref r = obj1.getRef();
if (visitedObjects.find(r.num) != visitedObjects.end()) {
- obj1.free();
continue;
}
visitedObjects.insert(r.num);
}
- obj1.fetch(xrefA, &obj2);
-
+ Object obj2 = obj1.fetch(xrefA);
if (obj2.isStream()) {
- obj2.streamGetDict()->lookup("Resources", &resObj);
+ Object resObj = obj2.streamGetDict()->lookup("Resources");
if (resObj.isDict() && resObj.getDict() != resDict) {
scanFonts(xrefA, resObj.getDict(), fontsList);
}
- resObj.free();
}
- obj1.free();
- obj2.free();
}
}
- objDict.free();
}
}
FontInfo::FontInfo(GfxFont *font, XRef *xref) {
GooString *origName;
- Object fontObj, toUnicodeObj;
- int i;
fontRef = *font->getID();
@@ -204,16 +191,16 @@
// look for a ToUnicode map
hasToUnicode = gFalse;
- if (xref->fetch(fontRef.num, fontRef.gen, &fontObj)->isDict()) {
- hasToUnicode = fontObj.dictLookup("ToUnicode", &toUnicodeObj)->isStream();
- toUnicodeObj.free();
+ Object fontObj = xref->fetch(fontRef.num, fontRef.gen);
+ if (fontObj.isDict()) {
+ hasToUnicode = fontObj.dictLookup("ToUnicode").isStream();
}
- fontObj.free();
// check for a font subset name: capital letters followed by a '+'
// sign
subset = gFalse;
if (name) {
+ int i;
for (i = 0; i < name->getLength(); ++i) {
if (name->getChar(i) < 'A' || name->getChar(i) > 'Z') {
break;
diff --git a/poppler/Form.cc b/poppler/Form.cc
index 4627a43..aaf9684 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -86,7 +86,7 @@
childNum = num;
doc = docA;
xref = doc->getXRef();
- aobj->copy(&obj);
+ obj = aobj->copy();
type = formUndef;
field = fieldA;
widget = NULL;
@@ -96,7 +96,6 @@
{
if (widget)
widget->decRefCnt();
- obj.free ();
}
#ifdef DEBUG_FORMS
@@ -109,10 +108,8 @@
if (widget)
return;
- Object obj1;
- obj1.initRef(ref.num, ref.gen);
- widget = new AnnotWidget(doc, obj.getDict(), &obj1, field);
- obj1.free();
+ Object obj1(ref.num, ref.gen);
+ widget = new AnnotWidget(doc, &obj, &obj1, field);
}
GBool FormWidget::inRect(double x, double y) const {
@@ -179,13 +176,13 @@
type = formButton;
onStr = NULL;
- Object obj1, obj2;
-
// Find the name of the ON state in the AP dictionnary
// The reference say the Off state, if it existe, _must_ be stored in the AP dict under the name /Off
// The "on" state may be stored under any other name
- if (obj.dictLookup("AP", &obj1)->isDict()) {
- if (obj1.dictLookup("N", &obj2)->isDict()) {
+ Object obj1 = obj.dictLookup("AP");
+ if (obj1.isDict()) {
+ Object obj2 = obj1.dictLookup("N");
+ if (obj2.isDict()) {
for (int i = 0; i < obj2.dictGetLength(); i++) {
char *key = obj2.dictGetKey(i);
if (strcmp (key, "Off") != 0) {
@@ -194,9 +191,7 @@
}
}
}
- obj2.free();
}
- obj1.free();
}
char *FormWidgetButton::getOnStr() {
@@ -463,7 +458,7 @@
{
doc = docA;
xref = doc->getXRef();
- aobj->copy(&obj);
+ obj = aobj->copy();
Dict* dict = obj.getDict();
ref.num = ref.gen = 0;
type = ty;
@@ -480,76 +475,65 @@
ref = aref;
- Object obj1;
//childs
- if (dict->lookup("Kids", &obj1)->isArray()) {
+ Object obj1 = dict->lookup("Kids");
+ if (obj1.isArray()) {
// Load children
for (int i = 0 ; i < obj1.arrayGetLength(); i++) {
- Object childRef, childObj;
-
- if (!obj1.arrayGetNF(i, &childRef)->isRef()) {
+ Object childRef = obj1.arrayGetNF(i);
+ if (!childRef.isRef()) {
error (errSyntaxError, -1, "Invalid form field renference");
- childRef.free();
continue;
}
- if (!obj1.arrayGet(i, &childObj)->isDict()) {
+ Object childObj = obj1.arrayGet(i);
+ if (!childObj.isDict()) {
error (errSyntaxError, -1, "Form field child is not a dictionary");
- childObj.free();
- childRef.free();
continue;
}
const Ref ref = childRef.getRef();
if (usedParents->find(ref.num) == usedParents->end()) {
- Object obj2, obj3;
// Field child: it could be a form field or a widget or composed dict
- if (childObj.dictLookupNF("Parent", &obj2)->isRef() || childObj.dictLookup("Parent", &obj3)->isDict()) {
+ Object obj2 = childObj.dictLookupNF("Parent");
+ Object obj3 = childObj.dictLookup("Parent");
+ if (obj2.isRef() || obj3.isDict()) {
// Child is a form field or composed dict
// We create the field, if it's composed
// it will create the widget as a child
std::set<int> usedParentsAux = *usedParents;
usedParentsAux.insert(ref.num);
- obj2.free();
- obj3.free();
if (terminal) {
error(errSyntaxWarning, -1, "Field can't have both Widget AND Field as kids\n");
- childObj.free();
- childRef.free();
continue;
}
numChildren++;
children = (FormField**)greallocn(children, numChildren, sizeof(FormField*));
children[numChildren - 1] = Form::createFieldFromDict(&childObj, doc, ref, this, &usedParentsAux);
- } else if (childObj.dictLookup("Subtype", &obj2)->isName("Widget")) {
- // Child is a widget annotation
- if (!terminal && numChildren > 0) {
- error(errSyntaxWarning, -1, "Field can't have both Widget AND Field as kids\n");
- obj2.free();
- obj3.free();
- childObj.free();
- childRef.free();
- continue;
- }
- _createWidget(&childObj, ref);
- }
- obj2.free();
- obj3.free();
+ } else {
+ obj2 = childObj.dictLookup("Subtype");
+ if (obj2.isName("Widget")) {
+ // Child is a widget annotation
+ if (!terminal && numChildren > 0) {
+ error(errSyntaxWarning, -1, "Field can't have both Widget AND Field as kids\n");
+ continue;
+ }
+ _createWidget(&childObj, ref);
+ }
+ }
}
- childObj.free();
- childRef.free();
}
} else {
// No children, if it's a composed dict, create the child widget
- obj1.free();
- if (dict->lookup("Subtype", &obj1)->isName("Widget"))
+ obj1 = dict->lookup("Subtype");
+ if (obj1.isName("Widget"))
_createWidget(&obj, ref);
}
- obj1.free();
//flags
- if (Form::fieldLookup(dict, "Ff", &obj1)->isInt()) {
+ obj1 = Form::fieldLookup(dict, "Ff");
+ if (obj1.isInt()) {
int flags = obj1.getInt();
if (flags & 0x1) { // 1 -> ReadOnly
readOnly = true;
@@ -561,39 +545,38 @@
//TODO
}
}
- obj1.free();
// Variable Text
- if (Form::fieldLookup(dict, "DA", &obj1)->isString())
+ obj1 = Form::fieldLookup(dict, "DA");
+ if (obj1.isString())
defaultAppearance = obj1.getString()->copy();
- obj1.free();
- if (Form::fieldLookup(dict, "Q", &obj1)->isInt()) {
+ obj1 = Form::fieldLookup(dict, "Q");
+ if (obj1.isInt()) {
quadding = static_cast<VariableTextQuadding>(obj1.getInt());
hasQuadding = gTrue;
}
- obj1.free();
- if (dict->lookup("T", &obj1)->isString()) {
+ obj1 = dict->lookup("T");
+ if (obj1.isString()) {
partialName = obj1.getString()->copy();
} else {
partialName = NULL;
}
- obj1.free();
- if (dict->lookup("TU", &obj1)->isString()) {
+ obj1 = dict->lookup("TU");
+ if (obj1.isString()) {
alternateUiName = obj1.getString()->copy();
} else {
alternateUiName = NULL;
}
- obj1.free();
- if(dict->lookup("TM", &obj1)->isString()) {
+ obj1 = dict->lookup("TM");
+ if(obj1.isString()) {
mappingName = obj1.getString()->copy();
} else {
mappingName = NULL;
}
- obj1.free();
}
void FormField::setPartialName(const GooString &name)
@@ -601,9 +584,7 @@
delete partialName;
partialName = name.copy();
- Object obj1;
- obj1.initString(name.copy());
- obj.getDict()->set("T", &obj1);
+ obj.getDict()->set("T", Object(name.copy()));
xref->setModifiedObject(&obj, ref);
}
@@ -620,7 +601,6 @@
delete widgets[i];
gfree (widgets);
}
- obj.free();
delete defaultAppearance;
delete partialName;
@@ -690,7 +670,6 @@
default:
error(errSyntaxWarning, -1, "SubType on non-terminal field, invalid document?");
numChildren--;
- terminal = false;
}
}
@@ -712,7 +691,7 @@
}
GooString* FormField::getFullyQualifiedName() {
- Object obj1, obj2;
+ Object obj1;
Object parent;
GooString *parent_name;
GooString *full_name;
@@ -723,9 +702,10 @@
full_name = new GooString();
- obj.copy(&obj1);
- while (obj1.dictLookup("Parent", &parent)->isDict()) {
- if (parent.dictLookup("T", &obj2)->isString()) {
+ obj1 = obj.copy();
+ while (parent = obj1.dictLookup("Parent"), parent.isDict()) {
+ Object obj2 = parent.dictLookup("T");
+ if (obj2.isString()) {
parent_name = obj2.getString();
if (unicode_encoded) {
@@ -748,14 +728,9 @@
full_name->insert(0, parent_name);
}
}
- obj2.free();
}
- obj1.free();
- parent.copy(&obj1);
- parent.free();
+ obj1 = parent.copy();
}
- obj1.free();
- parent.free();
if (partialName) {
if (unicode_encoded) {
@@ -822,11 +797,11 @@
noAllOff = false;
siblings = NULL;
numSiblings = 0;
- appearanceState.initNull();
+ appearanceState.setToNull();
- Object obj1;
- btype = formButtonCheck;
- if (Form::fieldLookup(dict, "Ff", &obj1)->isInt()) {
+ btype = formButtonCheck;
+ Object obj1 = Form::fieldLookup(dict, "Ff");
+ if (obj1.isInt()) {
int flags = obj1.getInt();
if (flags & 0x10000) { // 17 -> push button
@@ -845,7 +820,7 @@
if (btype != formButtonPush) {
// Even though V is inheritable we are interested in the value of this
// field, if not present it's probably because it's a button in a set.
- dict->lookup("V", &appearanceState);
+ appearanceState = dict->lookup("V");
}
}
@@ -969,19 +944,13 @@
}
void FormFieldButton::updateState(char *state) {
- Object obj1;
-
- appearanceState.free();
- appearanceState.initName(state);
-
- appearanceState.copy(&obj1);
- obj.getDict()->set("V", &obj1);
+ appearanceState = Object(objName, state);
+ obj.getDict()->set("V", appearanceState.copy());
xref->setModifiedObject(&obj, ref);
}
FormFieldButton::~FormFieldButton()
{
- appearanceState.free();
if (siblings)
gfree(siblings);
}
@@ -998,7 +967,8 @@
multiline = password = fileSelect = doNotSpellCheck = doNotScroll = comb = richText = false;
maxLen = 0;
- if (Form::fieldLookup(dict, "Ff", &obj1)->isInt()) {
+ obj1 = Form::fieldLookup(dict, "Ff");
+ if (obj1.isInt()) {
int flags = obj1.getInt();
if (flags & 0x1000) // 13 -> Multiline
multiline = true;
@@ -1015,14 +985,14 @@
if (flags & 0x2000000)// 26 -> RichText
richText = true;
}
- obj1.free();
- if (Form::fieldLookup(dict, "MaxLen", &obj1)->isInt()) {
+ obj1 = Form::fieldLookup(dict, "MaxLen");
+ if (obj1.isInt()) {
maxLen = obj1.getInt();
}
- obj1.free();
- if (Form::fieldLookup(dict, "V", &obj1)->isString()) {
+ obj1 = Form::fieldLookup(dict, "V");
+ if (obj1.isString()) {
if (obj1.getString()->hasUnicodeMarker()) {
if (obj1.getString()->getLength() > 2)
content = obj1.getString()->copy();
@@ -1034,7 +1004,6 @@
delete [] tmp_str;
}
}
- obj1.free();
}
#ifdef DEBUG_FORMS
@@ -1066,9 +1035,7 @@
}
}
- Object obj1;
- obj1.initString(content ? content->copy() : new GooString(""));
- obj.getDict()->set("V", &obj1);
+ obj.getDict()->set("V", Object(content ? content->copy() : new GooString("")));
xref->setModifiedObject(&obj, ref);
updateChildrenAppearance();
}
@@ -1095,7 +1062,8 @@
combo = edit = multiselect = doNotSpellCheck = doCommitOnSelChange = false;
- if (Form::fieldLookup(dict, "Ff", &obj1)->isInt()) {
+ obj1 = Form::fieldLookup(dict, "Ff");
+ if (obj1.isInt()) {
int flags = obj1.getInt();
if (flags & 0x20000) // 18 -> Combo
combo = true;
@@ -1108,67 +1076,62 @@
if (flags & 0x4000000) // 27 -> CommitOnSelChange
doCommitOnSelChange = true;
}
- obj1.free();
- if (dict->lookup("TI", &obj1)->isInt())
+ obj1 = dict->lookup("TI");
+ if (obj1.isInt())
topIdx = obj1.getInt();
- obj1.free();
- if (dict->lookup("Opt", &obj1)->isArray()) {
- Object obj2;
-
+ obj1 = dict->lookup("Opt");
+ if (obj1.isArray()) {
numChoices = obj1.arrayGetLength();
choices = new ChoiceOpt[numChoices];
memset(choices, 0, sizeof(ChoiceOpt) * numChoices);
for (int i = 0; i < numChoices; i++) {
- if (obj1.arrayGet(i, &obj2)->isString()) {
+ Object obj2 = obj1.arrayGet(i);
+ if (obj2.isString()) {
choices[i].optionName = obj2.getString()->copy();
} else if (obj2.isArray()) { // [Export_value, Displayed_text]
- Object obj3;
-
if (obj2.arrayGetLength() < 2) {
error(errSyntaxError, -1, "FormWidgetChoice:: invalid Opt entry -- array's length < 2\n");
continue;
}
- if (obj2.arrayGet(0, &obj3)->isString())
+ Object obj3 = obj2.arrayGet(0);
+ if (obj3.isString())
choices[i].exportVal = obj3.getString()->copy();
else
error(errSyntaxError, -1, "FormWidgetChoice:: invalid Opt entry -- exported value not a string\n");
- obj3.free();
- if (obj2.arrayGet(1, &obj3)->isString())
+ obj3 = obj2.arrayGet(1);
+ if (obj3.isString())
choices[i].optionName = obj3.getString()->copy();
else
error(errSyntaxError, -1, "FormWidgetChoice:: invalid Opt entry -- choice name not a string\n");
- obj3.free();
} else {
error(errSyntaxError, -1, "FormWidgetChoice:: invalid {0:d} Opt entry\n", i);
}
- obj2.free();
}
} else {
//empty choice
}
- obj1.free();
// Find selected items
// Note: PDF specs say that /V has precedence over /I, but acroread seems to
// do the opposite. We do the same.
- if (Form::fieldLookup(dict, "I", &obj1)->isArray()) {
+ obj1 = Form::fieldLookup(dict, "I");
+ if (obj1.isArray()) {
for (int i = 0; i < obj1.arrayGetLength(); i++) {
- Object obj2;
- if (obj1.arrayGet(i, &obj2)->isInt() && obj2.getInt() >= 0 && obj2.getInt() < numChoices) {
+ Object obj2 = obj1.arrayGet(i);
+ if (obj2.isInt() && obj2.getInt() >= 0 && obj2.getInt() < numChoices) {
choices[obj2.getInt()].selected = true;
}
- obj2.free();
}
} else {
- obj1.free();
// Note: According to PDF specs, /V should *never* contain the exportVal.
// However, if /Opt is an array of (exportVal,optionName) pairs, acroread
// seems to expect the exportVal instead of the optionName and so we do too.
- if (Form::fieldLookup(dict, "V", &obj1)->isString()) {
+ obj1 = Form::fieldLookup(dict, "V");
+ if (obj1.isString()) {
GBool optionFound = gFalse;
for (int i = 0; i < numChoices; i++) {
@@ -1195,8 +1158,7 @@
} else if (obj1.isArray()) {
for (int i = 0; i < numChoices; i++) {
for (int j = 0; j < obj1.arrayGetLength(); j++) {
- Object obj2;
- obj1.arrayGet(j, &obj2);
+ Object obj2 = obj1.arrayGet(j);
GBool matches = gFalse;
if (choices[i].exportVal) {
@@ -1209,8 +1171,6 @@
}
}
- obj2.free();
-
if (matches) {
choices[i].selected = true;
break; // We've determined that this option is selected. No need to keep on scanning
@@ -1219,7 +1179,6 @@
}
}
}
- obj1.free();
}
FormFieldChoice::~FormFieldChoice()
@@ -1241,35 +1200,35 @@
#endif
void FormFieldChoice::updateSelection() {
- Object objV, objI, obj1;
- objI.initNull();
+ Object objV, obj1;
+ Object objI(objNull);
if (edit && editedChoice) {
// This is an editable combo-box with user-entered text
- objV.initString(editedChoice->copy());
+ objV = Object(editedChoice->copy());
} else {
const int numSelected = getNumSelected();
// Create /I array only if multiple selection is allowed (as per PDF spec)
if (multiselect) {
- objI.initArray(xref);
+ objI = Object(new Array(xref));
}
if (numSelected == 0) {
// No options are selected
- objV.initString(new GooString(""));
+ objV = Object(new GooString(""));
} else if (numSelected == 1) {
// Only one option is selected
for (int i = 0; i < numChoices; i++) {
if (choices[i].selected) {
if (multiselect) {
- objI.arrayAdd(obj1.initInt(i));
+ objI.arrayAdd(Object(i));
}
if (choices[i].exportVal) {
- objV.initString(choices[i].exportVal->copy());
+ objV = Object(choices[i].exportVal->copy());
} else if (choices[i].optionName) {
- objV.initString(choices[i].optionName->copy());
+ objV = Object(choices[i].optionName->copy());
}
break; // We've just written the selected option. No need to keep on scanning
@@ -1277,25 +1236,25 @@
}
} else {
// More than one option is selected
- objV.initArray(xref);
+ objV = Object(new Array(xref));
for (int i = 0; i < numChoices; i++) {
if (choices[i].selected) {
if (multiselect) {
- objI.arrayAdd(obj1.initInt(i));
+ objI.arrayAdd(Object(i));
}
if (choices[i].exportVal) {
- objV.arrayAdd(obj1.initString(choices[i].exportVal->copy()));
+ objV.arrayAdd(Object(choices[i].exportVal->copy()));
} else if (choices[i].optionName) {
- objV.arrayAdd(obj1.initString(choices[i].optionName->copy()));
+ objV.arrayAdd(Object(choices[i].optionName->copy()));
}
}
}
}
}
- obj.getDict()->set("V", &objV);
- obj.getDict()->set("I", &objI);
+ obj.getDict()->set("V", std::move(objV));
+ obj.getDict()->set("I", std::move(objI));
xref->setModifiedObject(&obj, ref);
updateChildrenAppearance();
}
@@ -1396,7 +1355,6 @@
FormFieldSignature::~FormFieldSignature()
{
- byte_range.free();
delete signature_info;
delete signature;
}
@@ -1406,39 +1364,31 @@
if (!obj.isDict())
return;
- Object sig_dict, contents_obj, time_of_signing, subfilterName;
-
// retrieve PKCS#7
- obj.dictLookup("V", &sig_dict);
+ Object sig_dict = obj.dictLookup("V");
if (!sig_dict.isDict()) {
- sig_dict.free();
return;
}
- sig_dict.dictLookup("Contents", &contents_obj);
+ Object contents_obj = sig_dict.dictLookup("Contents");
if (contents_obj.isString()) {
signature = contents_obj.getString()->copy();
}
- contents_obj.free();
- sig_dict.dictLookup("ByteRange", &byte_range);
+ Object byte_range = sig_dict.dictLookup("ByteRange");
// retrieve SigningTime
- sig_dict.dictLookup("M", &time_of_signing);
+ Object time_of_signing = sig_dict.dictLookup("M");
if (time_of_signing.isString()) {
GooString *time_str = time_of_signing.getString();
signature_info->setSigningTime(dateStringToTime(time_str)); // Put this information directly in SignatureInfo object
- time_of_signing.free();
}
// check if subfilter is supported for signature validation, only detached signatures work for now
- sig_dict.dictLookup("SubFilter", &subfilterName);
+ Object subfilterName = sig_dict.dictLookup("SubFilter");
if (subfilterName.isName("adbe.pkcs7.detached") || subfilterName.isName("adbe.pkcs7.sha1")) {
signature_info->setSubFilterSupport(true);
}
-
- subfilterName.free();
- sig_dict.free();
}
void FormFieldSignature::hashSignedDataBlock(SignatureHandler *handler, Goffset block_len)
@@ -1505,9 +1455,8 @@
Goffset fileLength = doc->getBaseStream()->getLength();
for (int i = 0; i < arrayLen/2; i++) {
- Object offsetObj, lenObj;
- byte_range.arrayGet(i*2, &offsetObj);
- byte_range.arrayGet(i*2+1, &lenObj);
+ Object offsetObj = byte_range.arrayGet(i*2);
+ Object lenObj = byte_range.arrayGet(i*2+1);
if (!offsetObj.isIntOrInt64() || !lenObj.isIntOrInt64()) {
error(errSyntaxError, 0, "Illegal values in ByteRange array");
@@ -1573,50 +1522,41 @@
defaultAppearance = NULL;
defaultResources = NULL;
- acroForm->dictLookup("NeedAppearances", &obj1);
+ obj1 = acroForm->dictLookup("NeedAppearances");
needAppearances = (obj1.isBool() && obj1.getBool());
- obj1.free();
- if (acroForm->dictLookup("DA", &obj1)->isString())
+ obj1 = acroForm->dictLookup("DA");
+ if (obj1.isString())
defaultAppearance = obj1.getString()->copy();
- obj1.free();
- if (acroForm->dictLookup("Q", &obj1)->isInt())
+ obj1 = acroForm->dictLookup("Q");
+ if (obj1.isInt())
quadding = static_cast<VariableTextQuadding>(obj1.getInt());
- obj1.free();
- acroForm->dictLookup("DR", &resDict);
+ resDict = acroForm->dictLookup("DR");
if (resDict.isDict()) {
// At a minimum, this dictionary shall contain a Font entry
- if (resDict.dictLookup("Font", &obj1)->isDict())
+ obj1 = resDict.dictLookup("Font");
+ if (obj1.isDict())
defaultResources = new GfxResources(xref, resDict.getDict(), NULL);
- obj1.free();
}
if (!defaultResources) {
- resDict.free();
- resDict.initNull();
+ resDict.setToNull();
}
- acroForm->dictLookup("Fields", &obj1);
+ obj1 = acroForm->dictLookup("Fields");
if (obj1.isArray()) {
Array *array = obj1.getArray();
- Object obj2;
-
for(int i=0; i<array->getLength(); i++) {
- Object oref;
- array->get(i, &obj2);
- array->getNF(i, &oref);
+ Object obj2 = array->get(i);
+ Object oref = array->getNF(i);
if (!oref.isRef()) {
error(errSyntaxWarning, -1, "Direct object in rootFields");
- obj2.free();
- oref.free();
continue;
}
if (!obj2.isDict()) {
error(errSyntaxWarning, -1, "Reference in Fields array to an invalid or non existent object");
- obj2.free();
- oref.free();
continue;
}
@@ -1628,32 +1568,24 @@
std::set<int> usedParents;
rootFields[numFields++] = createFieldFromDict (&obj2, doc, oref.getRef(), NULL, &usedParents);
- obj2.free();
- oref.free();
}
} else {
error(errSyntaxError, -1, "Can't get Fields array\n");
}
- obj1.free ();
- acroForm->dictLookup("CO", &obj1);
+ obj1 = acroForm->dictLookup("CO");
if (obj1.isArray()) {
Array *array = obj1.getArray();
calculateOrder.reserve(array->getLength());
for(int i=0; i<array->getLength(); i++) {
- Object oref;
- array->getNF(i, &oref);
+ Object oref = array->getNF(i);
if (!oref.isRef()) {
error(errSyntaxWarning, -1, "Direct object in CO");
- oref.free();
continue;
}
calculateOrder.push_back(oref.getRef());
-
- oref.free();
}
}
- obj1.free ();
#ifdef DEBUG_FORMS
for (int i = 0; i < numFields; i++)
@@ -1668,54 +1600,43 @@
gfree (rootFields);
delete defaultAppearance;
delete defaultResources;
- resDict.free();
}
// Look up an inheritable field dictionary entry.
-static Object *fieldLookup(Dict *field, const char *key, Object *obj, std::set<int> *usedParents) {
- Dict *dict;
- Object parent;
-
- dict = field;
- if (!dict->lookup(key, obj)->isNull()) {
+static Object fieldLookup(Dict *field, const char *key, std::set<int> *usedParents) {
+ Dict *dict = field;
+ Object obj = dict->lookup(key);
+ if (!obj.isNull()) {
return obj;
}
- obj->free();
- dict->lookupNF("Parent", &parent);
+ Object parent = dict->lookupNF("Parent");
if (parent.isRef()) {
const Ref ref = parent.getRef();
if (usedParents->find(ref.num) == usedParents->end()) {
usedParents->insert(ref.num);
- Object obj2;
- parent.fetch(dict->getXRef(), &obj2);
+ Object obj2 = parent.fetch(dict->getXRef());
if (obj2.isDict()) {
- fieldLookup(obj2.getDict(), key, obj, usedParents);
- } else {
- obj->initNull();
+ return fieldLookup(obj2.getDict(), key, usedParents);
}
- obj2.free();
}
} else if (parent.isDict()) {
- fieldLookup(parent.getDict(), key, obj, usedParents);
- } else {
- obj->initNull();
+ return fieldLookup(parent.getDict(), key, usedParents);
}
- parent.free();
- return obj;
+ return Object(objNull);
}
-Object *Form::fieldLookup(Dict *field, const char *key, Object *obj) {
+Object Form::fieldLookup(Dict *field, const char *key) {
std::set<int> usedParents;
- return ::fieldLookup(field, key, obj, &usedParents);
+ return ::fieldLookup(field, key, &usedParents);
}
FormField *Form::createFieldFromDict (Object* obj, PDFDoc *docA, const Ref& pref, FormField *parent, std::set<int> *usedParents)
{
- Object obj2;
FormField *field;
- if (Form::fieldLookup(obj->getDict (), "FT", &obj2)->isName("Btn")) {
+ Object obj2 = Form::fieldLookup(obj->getDict (), "FT");
+ if (obj2.isName("Btn")) {
field = new FormFieldButton(docA, obj, pref, parent, usedParents);
} else if (obj2.isName("Tx")) {
field = new FormFieldText(docA, obj, pref, parent, usedParents);
@@ -1726,7 +1647,6 @@
} else { //we don't have an FT entry => non-terminal field
field = new FormField(docA, obj, pref, parent, usedParents);
}
- obj2.free();
return field;
}
diff --git a/poppler/Form.h b/poppler/Form.h
index 8ddb6fe..d73ab89 100644
--- a/poppler/Form.h
+++ b/poppler/Form.h
@@ -522,7 +522,7 @@
~Form();
// Look up an inheritable field dictionary entry.
- static Object *fieldLookup(Dict *field, const char *key, Object *obj);
+ static Object fieldLookup(Dict *field, const char *key);
/* Creates a new Field of the type specified in obj's dict.
used in Form::Form and FormField::FormField */
diff --git a/poppler/Function.cc b/poppler/Function.cc
index 785933d..92ba5f7 100644
--- a/poppler/Function.cc
+++ b/poppler/Function.cc
@@ -67,7 +67,6 @@
Function *func;
Dict *dict;
int funcType;
- Object obj1;
if (funcObj->isStream()) {
dict = funcObj->streamGetDict();
@@ -80,13 +79,12 @@
return NULL;
}
- if (!dict->lookup("FunctionType", &obj1)->isInt()) {
+ Object obj1 = dict->lookup("FunctionType");
+ if (!obj1.isInt()) {
error(errSyntaxError, -1, "Function type is missing or wrong type");
- obj1.free();
- return NULL;
+ return nullptr;
}
funcType = obj1.getInt();
- obj1.free();
if (funcType == 0) {
func = new SampledFunction(funcObj, dict);
@@ -119,75 +117,65 @@
}
GBool Function::init(Dict *dict) {
- Object obj1, obj2;
+ Object obj1;
int i;
//----- Domain
- if (!dict->lookup("Domain", &obj1)->isArray()) {
+ obj1 = dict->lookup("Domain");
+ if (!obj1.isArray()) {
error(errSyntaxError, -1, "Function is missing domain");
- goto err2;
+ return gFalse;
}
m = obj1.arrayGetLength() / 2;
if (m > funcMaxInputs) {
error(errSyntaxError, -1, "Functions with more than {0:d} inputs are unsupported",
funcMaxInputs);
- goto err2;
+ return gFalse;
}
for (i = 0; i < m; ++i) {
- obj1.arrayGet(2*i, &obj2);
+ Object obj2 = obj1.arrayGet(2*i);
if (!obj2.isNum()) {
error(errSyntaxError, -1, "Illegal value in function domain array");
- goto err1;
+ return gFalse;
}
domain[i][0] = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2*i+1, &obj2);
+ obj2 = obj1.arrayGet(2*i+1);
if (!obj2.isNum()) {
error(errSyntaxError, -1, "Illegal value in function domain array");
- goto err1;
+ return gFalse;
}
domain[i][1] = obj2.getNum();
- obj2.free();
}
- obj1.free();
//----- Range
hasRange = gFalse;
n = 0;
- if (dict->lookup("Range", &obj1)->isArray()) {
+ obj1 = dict->lookup("Range");
+ if (obj1.isArray()) {
hasRange = gTrue;
n = obj1.arrayGetLength() / 2;
if (n > funcMaxOutputs) {
error(errSyntaxError, -1, "Functions with more than {0:d} outputs are unsupported",
funcMaxOutputs);
- goto err2;
+ return gFalse;
}
for (i = 0; i < n; ++i) {
- obj1.arrayGet(2*i, &obj2);
+ Object obj2 = obj1.arrayGet(2*i);
if (!obj2.isNum()) {
error(errSyntaxError, -1, "Illegal value in function range array");
- goto err1;
+ return gFalse;
}
range[i][0] = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2*i+1, &obj2);
+ obj2 = obj1.arrayGet(2*i+1);
if (!obj2.isNum()) {
error(errSyntaxError, -1, "Illegal value in function range array");
- goto err1;
+ return gFalse;
}
range[i][1] = obj2.getNum();
- obj2.free();
}
}
- obj1.free();
return gTrue;
-
- err1:
- obj2.free();
- err2:
- obj1.free();
- return gFalse;
}
//------------------------------------------------------------------------
@@ -227,7 +215,7 @@
Stream *str;
int sampleBits;
double sampleMul;
- Object obj1, obj2;
+ Object obj1;
Guint buf, bitMask;
int bits;
Guint s;
@@ -241,16 +229,16 @@
//----- initialize the generic stuff
if (!init(dict)) {
- goto err1;
+ return;
}
if (!hasRange) {
error(errSyntaxError, -1, "Type 0 function is missing range");
- goto err1;
+ return;
}
if (m > sampledFuncMaxInputs) {
error(errSyntaxError, -1, "Sampled functions with more than {0:d} inputs are unsupported",
sampledFuncMaxInputs);
- goto err1;
+ return;
}
//----- buffer
@@ -259,30 +247,28 @@
//----- get the stream
if (!funcObj->isStream()) {
error(errSyntaxError, -1, "Type 0 function isn't a stream");
- goto err1;
+ return;
}
str = funcObj->getStream();
//----- Size
- if (!dict->lookup("Size", &obj1)->isArray() ||
- obj1.arrayGetLength() != m) {
+ obj1 = dict->lookup("Size");
+ if (!obj1.isArray() || obj1.arrayGetLength() != m) {
error(errSyntaxError, -1, "Function has missing or invalid size array");
- goto err2;
+ return;
}
for (i = 0; i < m; ++i) {
- obj1.arrayGet(i, &obj2);
+ Object obj2 = obj1.arrayGet(i);
if (!obj2.isInt()) {
error(errSyntaxError, -1, "Illegal value in function size array");
- goto err3;
+ return;
}
sampleSize[i] = obj2.getInt();
if (sampleSize[i] <= 0) {
error(errSyntaxError, -1, "Illegal non-positive value in function size array");
- goto err3;
+ return;
}
- obj2.free();
}
- obj1.free();
idxOffset = (int *)gmallocn(1 << m, sizeof(int));
for (i = 0; i < (1<<m); ++i) {
idx = 0;
@@ -303,32 +289,30 @@
}
//----- BitsPerSample
- if (!dict->lookup("BitsPerSample", &obj1)->isInt()) {
+ obj1 = dict->lookup("BitsPerSample");
+ if (!obj1.isInt()) {
error(errSyntaxError, -1, "Function has missing or invalid BitsPerSample");
- goto err2;
+ return;
}
sampleBits = obj1.getInt();
sampleMul = 1.0 / (pow(2.0, (double)sampleBits) - 1);
- obj1.free();
//----- Encode
- if (dict->lookup("Encode", &obj1)->isArray() &&
- obj1.arrayGetLength() == 2*m) {
+ obj1 = dict->lookup("Encode");
+ if (obj1.isArray() && obj1.arrayGetLength() == 2*m) {
for (i = 0; i < m; ++i) {
- obj1.arrayGet(2*i, &obj2);
+ Object obj2 = obj1.arrayGet(2*i);
if (!obj2.isNum()) {
error(errSyntaxError, -1, "Illegal value in function encode array");
- goto err3;
+ return;
}
encode[i][0] = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2*i+1, &obj2);
+ obj2 = obj1.arrayGet(2*i+1);
if (!obj2.isNum()) {
error(errSyntaxError, -1, "Illegal value in function encode array");
- goto err3;
+ return;
}
encode[i][1] = obj2.getNum();
- obj2.free();
}
} else {
for (i = 0; i < m; ++i) {
@@ -336,30 +320,28 @@
encode[i][1] = sampleSize[i] - 1;
}
}
- obj1.free();
for (i = 0; i < m; ++i) {
inputMul[i] = (encode[i][1] - encode[i][0]) /
(domain[i][1] - domain[i][0]);
}
//----- Decode
- if (dict->lookup("Decode", &obj1)->isArray() &&
+ obj1 = dict->lookup("Decode");
+ if (obj1.isArray() &&
obj1.arrayGetLength() == 2*n) {
for (i = 0; i < n; ++i) {
- obj1.arrayGet(2*i, &obj2);
+ Object obj2 = obj1.arrayGet(2*i);
if (!obj2.isNum()) {
error(errSyntaxError, -1, "Illegal value in function decode array");
- goto err3;
+ return;
}
decode[i][0] = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2*i+1, &obj2);
+ obj2 = obj1.arrayGet(2*i+1);
if (!obj2.isNum()) {
error(errSyntaxError, -1, "Illegal value in function decode array");
- goto err3;
+ return;
}
decode[i][1] = obj2.getNum();
- obj2.free();
}
} else {
for (i = 0; i < n; ++i) {
@@ -367,7 +349,6 @@
decode[i][1] = range[i][1];
}
}
- obj1.free();
//----- samples
nSamples = n;
@@ -409,14 +390,6 @@
transform(in, cacheOut);
ok = gTrue;
- return;
-
- err3:
- obj2.free();
- err2:
- obj1.free();
- err1:
- return;
}
SampledFunction::~SampledFunction() {
@@ -556,92 +529,81 @@
//------------------------------------------------------------------------
ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) {
- Object obj1, obj2;
- int i;
+ Object obj1;
ok = gFalse;
//----- initialize the generic stuff
if (!init(dict)) {
- goto err1;
+ return;
}
if (m != 1) {
error(errSyntaxError, -1, "Exponential function with more than one input");
- goto err1;
+ return;
}
//----- C0
- if (dict->lookup("C0", &obj1)->isArray()) {
+ obj1 = dict->lookup("C0");
+ if (obj1.isArray()) {
if (hasRange && obj1.arrayGetLength() != n) {
error(errSyntaxError, -1, "Function's C0 array is wrong length");
- goto err2;
+ return;
}
n = obj1.arrayGetLength();
if (unlikely(n > funcMaxOutputs)) {
error(errSyntaxError, -1, "Function's C0 array is wrong length");
n = funcMaxOutputs;
}
- for (i = 0; i < n; ++i) {
- obj1.arrayGet(i, &obj2);
+ for (int i = 0; i < n; ++i) {
+ Object obj2 = obj1.arrayGet(i);
if (!obj2.isNum()) {
error(errSyntaxError, -1, "Illegal value in function C0 array");
- goto err3;
+ return;
}
c0[i] = obj2.getNum();
- obj2.free();
}
} else {
if (hasRange && n != 1) {
error(errSyntaxError, -1, "Function's C0 array is wrong length");
- goto err2;
+ return;
}
n = 1;
c0[0] = 0;
}
- obj1.free();
//----- C1
- if (dict->lookup("C1", &obj1)->isArray()) {
+ obj1 = dict->lookup("C1");
+ if (obj1.isArray()) {
if (obj1.arrayGetLength() != n) {
error(errSyntaxError, -1, "Function's C1 array is wrong length");
- goto err2;
+ return;
}
- for (i = 0; i < n; ++i) {
- obj1.arrayGet(i, &obj2);
+ for (int i = 0; i < n; ++i) {
+ Object obj2 = obj1.arrayGet(i);
if (!obj2.isNum()) {
error(errSyntaxError, -1, "Illegal value in function C1 array");
- goto err3;
+ return;
}
c1[i] = obj2.getNum();
- obj2.free();
}
} else {
if (n != 1) {
error(errSyntaxError, -1, "Function's C1 array is wrong length");
- goto err2;
+ return;
}
c1[0] = 1;
}
- obj1.free();
//----- N (exponent)
- if (!dict->lookup("N", &obj1)->isNum()) {
+ obj1 = dict->lookup("N");
+ if (!obj1.isNum()) {
error(errSyntaxError, -1, "Function has missing or invalid N");
- goto err2;
+ return;
}
e = obj1.getNum();
- obj1.free();
isLinear = fabs(e-1.) < 1e-10;
ok = gTrue;
- return;
-
- err3:
- obj2.free();
- err2:
- obj1.free();
- err1:
- return;
}
ExponentialFunction::~ExponentialFunction() {
@@ -685,7 +647,7 @@
//------------------------------------------------------------------------
StitchingFunction::StitchingFunction(Object *funcObj, Dict *dict, std::set<int> *usedParents) {
- Object obj1, obj2;
+ Object obj1;
int i;
ok = gFalse;
@@ -696,17 +658,18 @@
//----- initialize the generic stuff
if (!init(dict)) {
- goto err1;
+ return;
}
if (m != 1) {
error(errSyntaxError, -1, "Stitching function with more than one input");
- goto err1;
+ return;
}
//----- Functions
- if (!dict->lookup("Functions", &obj1)->isArray()) {
+ obj1 = dict->lookup("Functions");
+ if (!obj1.isArray()) {
error(errSyntaxError, -1, "Missing 'Functions' entry in stitching function");
- goto err1;
+ return;
}
k = obj1.arrayGetLength();
funcs = (Function **)gmallocn(k, sizeof(Function *));
@@ -718,63 +681,58 @@
}
for (i = 0; i < k; ++i) {
std::set<int> usedParentsAux = *usedParents;
- obj1.arrayGetNF(i, &obj2);
+ Object obj2 = obj1.arrayGetNF(i);
if (obj2.isRef()) {
const Ref ref = obj2.getRef();
if (usedParentsAux.find(ref.num) == usedParentsAux.end()) {
usedParentsAux.insert(ref.num);
- obj2.free();
- obj1.arrayGet(i, &obj2);
+ obj2 = obj1.arrayGet(i);
} else {
- goto err2;
+ return;
}
}
if (!(funcs[i] = Function::parse(&obj2, &usedParentsAux))) {
- goto err2;
+ return;
}
if (funcs[i]->getInputSize() != 1 ||
(i > 0 && funcs[i]->getOutputSize() != funcs[0]->getOutputSize())) {
error(errSyntaxError, -1,
"Incompatible subfunctions in stitching function");
- goto err2;
+ return;
}
- obj2.free();
}
- obj1.free();
//----- Bounds
- if (!dict->lookup("Bounds", &obj1)->isArray() ||
- obj1.arrayGetLength() != k - 1) {
+ obj1 = dict->lookup("Bounds");
+ if (!obj1.isArray() || obj1.arrayGetLength() != k - 1) {
error(errSyntaxError, -1, "Missing or invalid 'Bounds' entry in stitching function");
- goto err1;
+ return;
}
bounds[0] = domain[0][0];
for (i = 1; i < k; ++i) {
- if (!obj1.arrayGet(i - 1, &obj2)->isNum()) {
+ Object obj2 = obj1.arrayGet(i - 1);
+ if (!obj2.isNum()) {
error(errSyntaxError, -1, "Invalid type in 'Bounds' array in stitching function");
- goto err2;
+ return;
}
bounds[i] = obj2.getNum();
- obj2.free();
}
bounds[k] = domain[0][1];
- obj1.free();
//----- Encode
- if (!dict->lookup("Encode", &obj1)->isArray() ||
- obj1.arrayGetLength() != 2 * k) {
+ obj1 = dict->lookup("Encode");
+ if (!obj1.isArray() || obj1.arrayGetLength() != 2 * k) {
error(errSyntaxError, -1, "Missing or invalid 'Encode' entry in stitching function");
- goto err1;
+ return;
}
for (i = 0; i < 2 * k; ++i) {
- if (!obj1.arrayGet(i, &obj2)->isNum()) {
+ Object obj2 = obj1.arrayGet(i);
+ if (!obj2.isNum()) {
error(errSyntaxError, -1, "Invalid type in 'Encode' array in stitching function");
- goto err2;
+ return;
}
encode[i] = obj2.getNum();
- obj2.free();
}
- obj1.free();
//----- pre-compute the scale factors
for (i = 0; i < k; ++i) {
@@ -790,11 +748,6 @@
n = funcs[0]->getOutputSize();
ok = gTrue;
return;
-
- err2:
- obj2.free();
- err1:
- obj1.free();
}
StitchingFunction::StitchingFunction(const StitchingFunction *func) : Function(func) {
diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc
index 3722028..4a9aab5 100644
--- a/poppler/Gfx.cc
+++ b/poppler/Gfx.cc
@@ -334,61 +334,51 @@
// build font dictionary
Dict *resDict = resDictA->copy(xref);
fonts = NULL;
- resDict->lookupNF("Font", &obj1);
+ obj1 = resDict->lookupNF("Font");
if (obj1.isRef()) {
- obj1.fetch(xref, &obj2);
+ obj2 = obj1.fetch(xref);
if (obj2.isDict()) {
r = obj1.getRef();
fonts = new GfxFontDict(xref, &r, obj2.getDict());
}
- obj2.free();
} else if (obj1.isDict()) {
fonts = new GfxFontDict(xref, NULL, obj1.getDict());
}
- obj1.free();
// get XObject dictionary
- resDict->lookup("XObject", &xObjDict);
+ xObjDict = resDict->lookup("XObject");
// get color space dictionary
- resDict->lookup("ColorSpace", &colorSpaceDict);
+ colorSpaceDict = resDict->lookup("ColorSpace");
// get pattern dictionary
- resDict->lookup("Pattern", &patternDict);
+ patternDict = resDict->lookup("Pattern");
// get shading dictionary
- resDict->lookup("Shading", &shadingDict);
+ shadingDict = resDict->lookup("Shading");
// get graphics state parameter dictionary
- resDict->lookup("ExtGState", &gStateDict);
+ gStateDict = resDict->lookup("ExtGState");
// get properties dictionary
- resDict->lookup("Properties", &propertiesDict);
+ propertiesDict = resDict->lookup("Properties");
delete resDict;
} else {
fonts = NULL;
- xObjDict.initNull();
- colorSpaceDict.initNull();
- patternDict.initNull();
- shadingDict.initNull();
- gStateDict.initNull();
- propertiesDict.initNull();
+ xObjDict.setToNull();
+ colorSpaceDict.setToNull();
+ patternDict.setToNull();
+ shadingDict.setToNull();
+ gStateDict.setToNull();
+ propertiesDict.setToNull();
}
next = nextA;
}
GfxResources::~GfxResources() {
- if (fonts) {
- delete fonts;
- }
- xObjDict.free();
- colorSpaceDict.free();
- patternDict.free();
- shadingDict.free();
- gStateDict.free();
- propertiesDict.free();
+ delete fonts;
}
GfxFont *GfxResources::lookupFont(char *name) {
@@ -405,75 +395,73 @@
return NULL;
}
-GBool GfxResources::lookupXObject(char *name, Object *obj) {
+Object GfxResources::lookupXObject(char *name) {
GfxResources *resPtr;
for (resPtr = this; resPtr; resPtr = resPtr->next) {
if (resPtr->xObjDict.isDict()) {
- if (!resPtr->xObjDict.dictLookup(name, obj)->isNull())
- return gTrue;
- obj->free();
+ Object obj = resPtr->xObjDict.dictLookup(name);
+ if (!obj.isNull())
+ return obj;
}
}
error(errSyntaxError, -1, "XObject '{0:s}' is unknown", name);
- return gFalse;
+ return Object(objNull);
}
-GBool GfxResources::lookupXObjectNF(char *name, Object *obj) {
+Object GfxResources::lookupXObjectNF(char *name) {
GfxResources *resPtr;
for (resPtr = this; resPtr; resPtr = resPtr->next) {
if (resPtr->xObjDict.isDict()) {
- if (!resPtr->xObjDict.dictLookupNF(name, obj)->isNull())
- return gTrue;
- obj->free();
+ Object obj = resPtr->xObjDict.dictLookupNF(name);
+ if (!obj.isNull())
+ return obj;
}
}
error(errSyntaxError, -1, "XObject '{0:s}' is unknown", name);
- return gFalse;
+ return Object(objNull);
}
-GBool GfxResources::lookupMarkedContentNF(char *name, Object *obj) {
+Object GfxResources::lookupMarkedContentNF(char *name) {
GfxResources *resPtr;
for (resPtr = this; resPtr; resPtr = resPtr->next) {
if (resPtr->propertiesDict.isDict()) {
- if (!resPtr->propertiesDict.dictLookupNF(name, obj)->isNull())
- return gTrue;
- obj->free();
+ Object obj = resPtr->propertiesDict.dictLookupNF(name);
+ if (!obj.isNull())
+ return obj;
}
}
error(errSyntaxError, -1, "Marked Content '{0:s}' is unknown", name);
- return gFalse;
+ return Object(objNull);
}
-void GfxResources::lookupColorSpace(const char *name, Object *obj) {
+Object GfxResources::lookupColorSpace(const char *name) {
GfxResources *resPtr;
for (resPtr = this; resPtr; resPtr = resPtr->next) {
if (resPtr->colorSpaceDict.isDict()) {
- if (!resPtr->colorSpaceDict.dictLookup(name, obj)->isNull()) {
- return;
+ Object obj = resPtr->colorSpaceDict.dictLookup(name);
+ if (!obj.isNull()) {
+ return obj;
}
- obj->free();
}
}
- obj->initNull();
+ return Object(objNull);
}
GfxPattern *GfxResources::lookupPattern(char *name, OutputDev *out, GfxState *state) {
GfxResources *resPtr;
GfxPattern *pattern;
- Object obj;
for (resPtr = this; resPtr; resPtr = resPtr->next) {
if (resPtr->patternDict.isDict()) {
- if (!resPtr->patternDict.dictLookup(name, &obj)->isNull()) {
+ Object obj = resPtr->patternDict.dictLookup(name);
+ if (!obj.isNull()) {
pattern = GfxPattern::parse(resPtr, &obj, out, state);
- obj.free();
return pattern;
}
- obj.free();
}
}
error(errSyntaxError, -1, "Unknown pattern '{0:s}'", name);
@@ -483,51 +471,50 @@
GfxShading *GfxResources::lookupShading(char *name, OutputDev *out, GfxState *state) {
GfxResources *resPtr;
GfxShading *shading;
- Object obj;
for (resPtr = this; resPtr; resPtr = resPtr->next) {
if (resPtr->shadingDict.isDict()) {
- if (!resPtr->shadingDict.dictLookup(name, &obj)->isNull()) {
+ Object obj = resPtr->shadingDict.dictLookup(name);
+ if (!obj.isNull()) {
shading = GfxShading::parse(resPtr, &obj, out, state);
- obj.free();
return shading;
}
- obj.free();
}
}
error(errSyntaxError, -1, "ExtGState '{0:s}' is unknown", name);
return NULL;
}
-GBool GfxResources::lookupGState(char *name, Object *obj) {
- if (!lookupGStateNF(name, obj))
- return gFalse;
+Object GfxResources::lookupGState(char *name) {
+ Object obj = lookupGStateNF(name);
+ if (obj.isNull())
+ return Object(objNull);
- if (!obj->isRef())
- return gTrue;
+ if (!obj.isRef())
+ return obj;
- const Ref ref = obj->getRef();
- if (!gStateCache.lookup(ref, obj)->isNull())
- return gTrue;
- obj->free();
+ const Ref ref = obj.getRef();
+ obj = gStateCache.lookup(ref);
+ if (!obj.isNull())
+ return obj;
- gStateCache.put(ref)->copy(obj);
- return gTrue;
+ obj = gStateCache.put(ref)->copy();
+ return obj;
}
-GBool GfxResources::lookupGStateNF(char *name, Object *obj) {
+Object GfxResources::lookupGStateNF(char *name) {
GfxResources *resPtr;
for (resPtr = this; resPtr; resPtr = resPtr->next) {
if (resPtr->gStateDict.isDict()) {
- if (!resPtr->gStateDict.dictLookupNF(name, obj)->isNull()) {
- return gTrue;
+ Object obj = resPtr->gStateDict.dictLookupNF(name);
+ if (!obj.isNull()) {
+ return obj;
}
- obj->free();
}
}
error(errSyntaxError, -1, "ExtGState '{0:s}' is unknown", name);
- return gFalse;
+ return Object(objNull);
}
//------------------------------------------------------------------------
@@ -652,17 +639,13 @@
#endif
void Gfx::initDisplayProfile() {
- Object catDict;
- xref->getCatalog(&catDict);
+ Object catDict = xref->getCatalog();
if (catDict.isDict()) {
- Object outputIntents;
- catDict.dictLookup("OutputIntents", &outputIntents);
+ Object outputIntents = catDict.dictLookup("OutputIntents");
if (outputIntents.isArray() && outputIntents.arrayGetLength() == 1) {
- Object firstElement;
- outputIntents.arrayGet(0, &firstElement);
+ Object firstElement = outputIntents.arrayGet(0);
if (firstElement.isDict()) {
- Object profile;
- firstElement.dictLookup("DestOutputProfile", &profile);
+ Object profile = firstElement.dictLookup("DestOutputProfile");
if (profile.isStream()) {
Stream *iccStream = profile.getStream();
int length = 0;
@@ -675,13 +658,9 @@
}
gfree(profBuf);
}
- profile.free();
}
- firstElement.free();
}
- outputIntents.free();
}
- catDict.free();
}
#endif
@@ -708,18 +687,15 @@
}
void Gfx::display(Object *obj, GBool topLevel) {
- Object obj2;
int i;
if (obj->isArray()) {
for (i = 0; i < obj->arrayGetLength(); ++i) {
- obj->arrayGet(i, &obj2);
+ Object obj2 = obj->arrayGet(i);
if (!obj2.isStream()) {
error(errSyntaxError, -1, "Weird page contents");
- obj2.free();
return;
}
- obj2.free();
}
} else if (!obj->isStream()) {
error(errSyntaxError, -1, "Weird page contents");
@@ -742,7 +718,7 @@
updateLevel = 1; // make sure even empty pages trigger a call to dump()
lastAbortCheck = 0;
numArgs = 0;
- parser->getObj(&obj);
+ obj = parser->getObj();
while (!obj.isEOF()) {
commandAborted = gFalse;
@@ -786,9 +762,8 @@
}
delete timer;
}
- obj.free();
for (i = 0; i < numArgs; ++i)
- args[i].free();
+ args[i].setToNull(); // Free memory early
numArgs = 0;
// periodically update display
@@ -817,8 +792,7 @@
// got an argument - save it
} else if (numArgs < maxArgs) {
- args[numArgs++] = obj;
-
+ args[numArgs++] = std::move(obj);
// too many arguments - something is wrong
} else {
error(errSyntaxError, getPos(), "Too many args in content stream");
@@ -828,13 +802,11 @@
printf("\n");
fflush(stdout);
}
- obj.free();
}
// grab the next object
- parser->getObj(&obj);
+ obj = parser->getObj();
}
- obj.free();
// args at end with no command
if (numArgs > 0) {
@@ -848,8 +820,6 @@
printf("\n");
fflush(stdout);
}
- for (i = 0; i < numArgs; ++i)
- args[i].free();
}
popStateGuard();
@@ -975,7 +945,6 @@
void Gfx::opSetDash(Object args[], int numArgs) {
Array *a;
int length;
- Object obj;
double *dash;
int i;
@@ -986,11 +955,10 @@
} else {
dash = (double *)gmallocn(length, sizeof(double));
for (i = 0; i < length; ++i) {
- a->get(i, &obj);
+ Object obj = a->get(i);
if (obj.isNum()) {
dash[i] = obj.getNum();
}
- obj.free();
}
}
state->setLineDash(dash, length, args[1].getNum());
@@ -1023,8 +991,7 @@
}
void Gfx::opSetExtGState(Object args[], int numArgs) {
- Object obj1, obj2, obj3, obj4, obj5;
- Object args2[2];
+ Object obj1, obj2;
GfxBlendMode mode;
GBool haveFillOP;
Function *funcs[4];
@@ -1035,12 +1002,12 @@
double opac;
int i;
- if (!res->lookupGState(args[0].getName(), &obj1)) {
+ obj1 = res->lookupGState(args[0].getName());
+ if (obj1.isNull()) {
return;
}
if (!obj1.isDict()) {
error(errSyntaxError, getPos(), "ExtGState '{0:s}' is wrong type", args[0].getName());
- obj1.free();
return;
}
if (printCommands) {
@@ -1050,33 +1017,31 @@
}
// parameters that are also set by individual PDF operators
- if (obj1.dictLookup("LW", &obj2)->isNum()) {
+ obj2 = obj1.dictLookup("LW");
+ if (obj2.isNum()) {
opSetLineWidth(&obj2, 1);
}
- obj2.free();
- if (obj1.dictLookup("LC", &obj2)->isInt()) {
+ obj2 = obj1.dictLookup("LC");
+ if (obj2.isInt()) {
opSetLineCap(&obj2, 1);
}
- obj2.free();
- if (obj1.dictLookup("LJ", &obj2)->isInt()) {
+ obj2 = obj1.dictLookup("LJ");
+ if (obj2.isInt()) {
opSetLineJoin(&obj2, 1);
}
- obj2.free();
- if (obj1.dictLookup("ML", &obj2)->isNum()) {
+ obj2 = obj1.dictLookup("ML");
+ if (obj2.isNum()) {
opSetMiterLimit(&obj2, 1);
}
- obj2.free();
- if (obj1.dictLookup("D", &obj2)->isArray() &&
- obj2.arrayGetLength() == 2) {
- obj2.arrayGet(0, &args2[0]);
- obj2.arrayGet(1, &args2[1]);
+ obj2 = obj1.dictLookup("D");
+ if (obj2.isArray() && obj2.arrayGetLength() == 2) {
+ Object args2[2];
+ args2[0] = obj2.arrayGet(0);
+ args2[1] = obj2.arrayGet(1);
if (args2[0].isArray() && args2[1].isNum()) {
opSetDash(args2, 2);
}
- args2[0].free();
- args2[1].free();
}
- obj2.free();
#if 0 //~ need to add a new version of GfxResources::lookupFont() that
//~ takes an indirect ref instead of a name
if (obj1.dictLookup("Font", &obj2)->isArray() &&
@@ -1091,13 +1056,14 @@
}
obj2.free();
#endif
- if (obj1.dictLookup("FL", &obj2)->isNum()) {
+ obj2 = obj1.dictLookup("FL");
+ if (obj2.isNum()) {
opSetFlat(&obj2, 1);
}
- obj2.free();
// transparency support: blend mode, fill/stroke opacity
- if (!obj1.dictLookup("BM", &obj2)->isNull()) {
+ obj2 = obj1.dictLookup("BM");
+ if (!obj2.isNull()) {
if (state->parseBlendMode(&obj2, &mode)) {
state->setBlendMode(mode);
out->updateBlendMode(state);
@@ -1105,27 +1071,27 @@
error(errSyntaxError, getPos(), "Invalid blend mode in ExtGState");
}
}
- obj2.free();
- if (obj1.dictLookup("ca", &obj2)->isNum()) {
+ obj2 = obj1.dictLookup("ca");
+ if (obj2.isNum()) {
opac = obj2.getNum();
state->setFillOpacity(opac < 0 ? 0 : opac > 1 ? 1 : opac);
out->updateFillOpacity(state);
}
- obj2.free();
- if (obj1.dictLookup("CA", &obj2)->isNum()) {
+ obj2 = obj1.dictLookup("CA");
+ if (obj2.isNum()) {
opac = obj2.getNum();
state->setStrokeOpacity(opac < 0 ? 0 : opac > 1 ? 1 : opac);
out->updateStrokeOpacity(state);
}
- obj2.free();
// fill/stroke overprint, overprint mode
- if ((haveFillOP = (obj1.dictLookup("op", &obj2)->isBool()))) {
+ obj2 = obj1.dictLookup("op");
+ if ((haveFillOP = obj2.isBool())) {
state->setFillOverprint(obj2.getBool());
out->updateFillOverprint(state);
}
- obj2.free();
- if (obj1.dictLookup("OP", &obj2)->isBool()) {
+ obj2 = obj1.dictLookup("OP");
+ if (obj2.isBool()) {
state->setStrokeOverprint(obj2.getBool());
out->updateStrokeOverprint(state);
if (!haveFillOP) {
@@ -1133,24 +1099,23 @@
out->updateFillOverprint(state);
}
}
- obj2.free();
- if (obj1.dictLookup("OPM", &obj2)->isInt()) {
+ obj2 = obj1.dictLookup("OPM");
+ if (obj2.isInt()) {
state->setOverprintMode(obj2.getInt());
out->updateOverprintMode(state);
}
- obj2.free();
// stroke adjust
- if (obj1.dictLookup("SA", &obj2)->isBool()) {
+ obj2 = obj1.dictLookup("SA");
+ if (obj2.isBool()) {
state->setStrokeAdjust(obj2.getBool());
out->updateStrokeAdjust(state);
}
- obj2.free();
// transfer function
- if (obj1.dictLookup("TR2", &obj2)->isNull()) {
- obj2.free();
- obj1.dictLookup("TR", &obj2);
+ obj2 = obj1.dictLookup("TR2");
+ if (obj2.isNull()) {
+ obj2 = obj1.dictLookup("TR");
}
if (obj2.isName("Default") ||
obj2.isName("Identity")) {
@@ -1159,9 +1124,8 @@
out->updateTransfer(state);
} else if (obj2.isArray() && obj2.arrayGetLength() == 4) {
for (i = 0; i < 4; ++i) {
- obj2.arrayGet(i, &obj3);
+ Object obj3 = obj2.arrayGet(i);
funcs[i] = Function::parse(&obj3);
- obj3.free();
if (!funcs[i]) {
break;
}
@@ -1179,80 +1143,81 @@
} else if (!obj2.isNull()) {
error(errSyntaxError, getPos(), "Invalid transfer function in ExtGState");
}
- obj2.free();
// alpha is shape
- if (obj1.dictLookup("AIS", &obj2)->isBool()) {
+ obj2 = obj1.dictLookup("AIS");
+ if (obj2.isBool()) {
state->setAlphaIsShape(obj2.getBool());
out->updateAlphaIsShape(state);
}
- obj2.free();
// text knockout
- if (obj1.dictLookup("TK", &obj2)->isBool()) {
+ obj2 = obj1.dictLookup("TK");
+ if (obj2.isBool()) {
state->setTextKnockout(obj2.getBool());
out->updateTextKnockout(state);
}
- obj2.free();
// soft mask
- if (!obj1.dictLookup("SMask", &obj2)->isNull()) {
+ obj2 = obj1.dictLookup("SMask");
+ if (!obj2.isNull()) {
if (obj2.isName("None")) {
out->clearSoftMask(state);
} else if (obj2.isDict()) {
- if (obj2.dictLookup("S", &obj3)->isName("Alpha")) {
+ Object obj3 = obj2.dictLookup("S");
+ if (obj3.isName("Alpha")) {
alpha = gTrue;
} else { // "Luminosity"
alpha = gFalse;
}
- obj3.free();
funcs[0] = NULL;
- if (!obj2.dictLookup("TR", &obj3)->isNull()) {
+ obj3 = obj2.dictLookup("TR");
+ if (!obj3.isNull()) {
if (obj3.isName("Default") ||
obj3.isName("Identity")) {
funcs[0] = NULL;
} else {
funcs[0] = Function::parse(&obj3);
- if (funcs[0] == NULL ||
- funcs[0]->getInputSize() != 1 ||
- funcs[0]->getOutputSize() != 1) {
- error(errSyntaxError, getPos(),
+ if (funcs[0] == NULL ||
+ funcs[0]->getInputSize() != 1 ||
+ funcs[0]->getOutputSize() != 1) {
+ error(errSyntaxError, getPos(),
"Invalid transfer function in soft mask in ExtGState");
- delete funcs[0];
- funcs[0] = NULL;
+ delete funcs[0];
+ funcs[0] = NULL;
}
}
}
- obj3.free();
- if ((haveBackdropColor = obj2.dictLookup("BC", &obj3)->isArray())) {
+ obj3 = obj2.dictLookup("BC");
+ if ((haveBackdropColor = obj3.isArray())) {
for (i = 0; i < gfxColorMaxComps; ++i) {
backdropColor.c[i] = 0;
}
for (i = 0; i < obj3.arrayGetLength() && i < gfxColorMaxComps; ++i) {
- obj3.arrayGet(i, &obj4);
+ Object obj4 = obj3.arrayGet(i);
if (obj4.isNum()) {
backdropColor.c[i] = dblToCol(obj4.getNum());
}
- obj4.free();
}
}
- obj3.free();
- if (obj2.dictLookup("G", &obj3)->isStream()) {
- if (obj3.streamGetDict()->lookup("Group", &obj4)->isDict()) {
+ obj3 = obj2.dictLookup("G");
+ if (obj3.isStream()) {
+ Object obj4 = obj3.streamGetDict()->lookup("Group");
+ if (obj4.isDict()) {
blendingColorSpace = NULL;
isolated = knockout = gFalse;
- if (!obj4.dictLookup("CS", &obj5)->isNull()) {
+ Object obj5 = obj4.dictLookup("CS");
+ if (!obj5.isNull()) {
blendingColorSpace = GfxColorSpace::parse(res, &obj5, out, state);
}
- obj5.free();
- if (obj4.dictLookup("I", &obj5)->isBool()) {
+ obj5 = obj4.dictLookup("I");
+ if (obj5.isBool()) {
isolated = obj5.getBool();
}
- obj5.free();
- if (obj4.dictLookup("K", &obj5)->isBool()) {
+ obj5 = obj4.dictLookup("K");
+ if (obj5.isBool()) {
knockout = obj5.getBool();
}
- obj5.free();
if (!haveBackdropColor) {
if (blendingColorSpace) {
blendingColorSpace->getDefaultColor(&backdropColor);
@@ -1271,85 +1236,70 @@
} else {
error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState - missing group");
}
- obj4.free();
} else {
error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState - missing group");
}
- obj3.free();
} else if (!obj2.isNull()) {
error(errSyntaxError, getPos(), "Invalid soft mask in ExtGState");
}
}
- obj2.free();
- if (obj1.dictLookup("Font", &obj2)->isArray()) {
+ obj2 = obj1.dictLookup("Font");
+ if (obj2.isArray()) {
GfxFont *font;
if (obj2.arrayGetLength() == 2) {
- Object fargs0, fargs1;
-
- obj2.arrayGetNF(0,&fargs0);
- obj2.arrayGet(1,&fargs1);
+ Object fargs0 = obj2.arrayGetNF(0);
+ Object fargs1 = obj2.arrayGet(1);
if (fargs0.isRef() && fargs1.isNum()) {
- Object fobj;
- Ref r;
-
- fargs0.fetch(xref, &fobj);
+ Object fobj = fargs0.fetch(xref);
if (fobj.isDict()) {
- r = fargs0.getRef();
+ Ref r = fargs0.getRef();
font = GfxFont::makeFont(xref,args[0].getName(),r,fobj.getDict());
state->setFont(font,fargs1.getNum());
fontChanged = gTrue;
}
- fobj.free();
}
- fargs0.free();
- fargs1.free();
} else {
error(errSyntaxError, getPos(), "Number of args mismatch for /Font in ExtGState");
}
}
- obj2.free();
- if (obj1.dictLookup("LW", &obj2)->isNum()) {
+ obj2 = obj1.dictLookup("LW");
+ if (obj2.isNum()) {
opSetLineWidth(&obj2,1);
}
- obj2.free();
- if (obj1.dictLookup("LC", &obj2)->isInt()) {
+ obj2 = obj1.dictLookup("LC");
+ if (obj2.isInt()) {
opSetLineCap(&obj2,1);
}
- obj2.free();
- if (obj1.dictLookup("LJ", &obj2)->isInt()) {
+ obj2 = obj1.dictLookup("LJ");
+ if (obj2.isInt()) {
opSetLineJoin(&obj2,1);
}
- obj2.free();
- if (obj1.dictLookup("ML", &obj2)->isNum()) {
+ obj2 = obj1.dictLookup("ML");
+ if (obj2.isNum()) {
opSetMiterLimit(&obj2,1);
}
- obj2.free();
- if (obj1.dictLookup("D", &obj2)->isArray()) {
+ obj2 = obj1.dictLookup("D");
+ if (obj2.isArray()) {
if (obj2.arrayGetLength() == 2) {
Object dargs[2];
- obj2.arrayGetNF(0,&dargs[0]);
- obj2.arrayGet(1,&dargs[1]);
+ dargs[0] = obj2.arrayGetNF(0);
+ dargs[1] = obj2.arrayGet(1);
if (dargs[0].isArray() && dargs[1].isInt()) {
opSetDash(dargs,2);
}
- dargs[0].free();
- dargs[1].free();
} else {
error(errSyntaxError, getPos(), "Number of args mismatch for /D in ExtGState");
}
}
- obj2.free();
- if (obj1.dictLookup("RI", &obj2)->isName()) {
+ obj2 = obj1.dictLookup("RI");
+ if (obj2.isName()) {
opSetRenderingIntent(&obj2,1);
}
- obj2.free();
- if (obj1.dictLookup("FL", &obj2)->isNum()) {
+ obj2 = obj1.dictLookup("FL");
+ if (obj2.isNum()) {
opSetFlat(&obj2,1);
}
- obj2.free();
-
- obj1.free();
}
void Gfx::doSoftMask(Object *str, GBool alpha,
@@ -1358,7 +1308,7 @@
Function *transferFunc, GfxColor *backdropColor) {
Dict *dict, *resDict;
double m[6], bbox[4];
- Object obj1, obj2;
+ Object obj1;
int i;
// check for excessive recursion
@@ -1370,50 +1320,42 @@
dict = str->streamGetDict();
// check form type
- dict->lookup("FormType", &obj1);
+ obj1 = dict->lookup("FormType");
if (!(obj1.isNull() || (obj1.isInt() && obj1.getInt() == 1))) {
error(errSyntaxError, getPos(), "Unknown form type");
}
- obj1.free();
// get bounding box
- dict->lookup("BBox", &obj1);
+ obj1 = dict->lookup("BBox");
if (!obj1.isArray()) {
- obj1.free();
error(errSyntaxError, getPos(), "Bad form bounding box");
return;
}
for (i = 0; i < 4; ++i) {
- obj1.arrayGet(i, &obj2);
+ Object obj2 = obj1.arrayGet(i);
if (likely(obj2.isNum())) bbox[i] = obj2.getNum();
else {
- obj2.free();
- obj1.free();
error(errSyntaxError, getPos(), "Bad form bounding box (non number)");
return;
}
- obj2.free();
}
- obj1.free();
// get matrix
- dict->lookup("Matrix", &obj1);
+ obj1 = dict->lookup("Matrix");
if (obj1.isArray()) {
for (i = 0; i < 6; ++i) {
- obj1.arrayGet(i, &obj2);
+ Object obj2 = obj1.arrayGet(i);
if (likely(obj2.isNum())) m[i] = obj2.getNum();
else m[i] = 0;
- obj2.free();
}
} else {
m[0] = 1; m[1] = 0;
m[2] = 0; m[3] = 1;
m[4] = 0; m[5] = 0;
}
- obj1.free();
// get resources
- dict->lookup("Resources", &obj1);
+ obj1 = dict->lookup("Resources");
resDict = obj1.isDict() ? obj1.getDict() : (Dict *)NULL;
// draw it
@@ -1426,7 +1368,6 @@
if (blendingColorSpace) {
delete blendingColorSpace;
}
- obj1.free();
}
void Gfx::opSetRenderingIntent(Object args[], int numArgs) {
@@ -1440,17 +1381,15 @@
void Gfx::opSetFillGray(Object args[], int numArgs) {
GfxColor color;
GfxColorSpace *colorSpace = NULL;
- Object obj;
state->setFillPattern(NULL);
- res->lookupColorSpace("DefaultGray", &obj);
+ Object obj = res->lookupColorSpace("DefaultGray");
if (!obj.isNull()) {
colorSpace = GfxColorSpace::parse(res, &obj, out, state);
}
if (colorSpace == NULL) {
colorSpace = new GfxDeviceGrayColorSpace();
}
- obj.free();
state->setFillColorSpace(colorSpace);
out->updateFillColorSpace(state);
color.c[0] = dblToCol(args[0].getNum());
@@ -1461,17 +1400,15 @@
void Gfx::opSetStrokeGray(Object args[], int numArgs) {
GfxColor color;
GfxColorSpace *colorSpace = NULL;
- Object obj;
state->setStrokePattern(NULL);
- res->lookupColorSpace("DefaultGray", &obj);
+ Object obj = res->lookupColorSpace("DefaultGray");
if (!obj.isNull()) {
colorSpace = GfxColorSpace::parse(res, &obj, out, state);
}
if (colorSpace == NULL) {
colorSpace = new GfxDeviceGrayColorSpace();
}
- obj.free();
state->setStrokeColorSpace(colorSpace);
out->updateStrokeColorSpace(state);
color.c[0] = dblToCol(args[0].getNum());
@@ -1482,17 +1419,15 @@
void Gfx::opSetFillCMYKColor(Object args[], int numArgs) {
GfxColor color;
GfxColorSpace *colorSpace = NULL;
- Object obj;
int i;
- res->lookupColorSpace("DefaultCMYK", &obj);
+ Object obj = res->lookupColorSpace("DefaultCMYK");
if (!obj.isNull()) {
colorSpace = GfxColorSpace::parse(res, &obj, out, state);
}
if (colorSpace == NULL) {
colorSpace = new GfxDeviceCMYKColorSpace();
}
- obj.free();
state->setFillPattern(NULL);
state->setFillColorSpace(colorSpace);
out->updateFillColorSpace(state);
@@ -1506,18 +1441,16 @@
void Gfx::opSetStrokeCMYKColor(Object args[], int numArgs) {
GfxColor color;
GfxColorSpace *colorSpace = NULL;
- Object obj;
int i;
state->setStrokePattern(NULL);
- res->lookupColorSpace("DefaultCMYK", &obj);
+ Object obj = res->lookupColorSpace("DefaultCMYK");
if (!obj.isNull()) {
colorSpace = GfxColorSpace::parse(res, &obj, out, state);
}
if (colorSpace == NULL) {
colorSpace = new GfxDeviceCMYKColorSpace();
}
- obj.free();
state->setStrokeColorSpace(colorSpace);
out->updateStrokeColorSpace(state);
for (i = 0; i < 4; ++i) {
@@ -1528,20 +1461,18 @@
}
void Gfx::opSetFillRGBColor(Object args[], int numArgs) {
- Object obj;
GfxColorSpace *colorSpace = NULL;
GfxColor color;
int i;
state->setFillPattern(NULL);
- res->lookupColorSpace("DefaultRGB", &obj);
+ Object obj = res->lookupColorSpace("DefaultRGB");
if (!obj.isNull()) {
colorSpace = GfxColorSpace::parse(res, &obj, out, state);
}
if (colorSpace == NULL) {
colorSpace = new GfxDeviceRGBColorSpace();
}
- obj.free();
state->setFillColorSpace(colorSpace);
out->updateFillColorSpace(state);
for (i = 0; i < 3; ++i) {
@@ -1552,20 +1483,18 @@
}
void Gfx::opSetStrokeRGBColor(Object args[], int numArgs) {
- Object obj;
GfxColorSpace *colorSpace = NULL;
GfxColor color;
int i;
state->setStrokePattern(NULL);
- res->lookupColorSpace("DefaultRGB", &obj);
+ Object obj = res->lookupColorSpace("DefaultRGB");
if (!obj.isNull()) {
colorSpace = GfxColorSpace::parse(res, &obj, out, state);
}
if (colorSpace == NULL) {
colorSpace = new GfxDeviceRGBColorSpace();
}
- obj.free();
state->setStrokeColorSpace(colorSpace);
out->updateStrokeColorSpace(state);
for (i = 0; i < 3; ++i) {
@@ -1576,17 +1505,15 @@
}
void Gfx::opSetFillColorSpace(Object args[], int numArgs) {
- Object obj;
GfxColorSpace *colorSpace;
GfxColor color;
- res->lookupColorSpace(args[0].getName(), &obj);
+ Object obj = res->lookupColorSpace(args[0].getName());
if (obj.isNull()) {
colorSpace = GfxColorSpace::parse(res, &args[0], out, state);
} else {
colorSpace = GfxColorSpace::parse(res, &obj, out, state);
}
- obj.free();
if (colorSpace) {
state->setFillPattern(NULL);
state->setFillColorSpace(colorSpace);
@@ -1600,18 +1527,16 @@
}
void Gfx::opSetStrokeColorSpace(Object args[], int numArgs) {
- Object obj;
GfxColorSpace *colorSpace;
GfxColor color;
state->setStrokePattern(NULL);
- res->lookupColorSpace(args[0].getName(), &obj);
+ Object obj = res->lookupColorSpace(args[0].getName());
if (obj.isNull()) {
colorSpace = GfxColorSpace::parse(res, &args[0], out, state);
} else {
colorSpace = GfxColorSpace::parse(res, &obj, out, state);
}
- obj.free();
if (colorSpace) {
state->setStrokeColorSpace(colorSpace);
out->updateStrokeColorSpace(state);
@@ -3886,7 +3811,6 @@
void Gfx::opShowSpaceText(Object args[], int numArgs) {
Array *a;
- Object obj;
int wMode;
int i;
@@ -3902,7 +3826,7 @@
wMode = state->getFont()->getWMode();
a = args[0].getArray();
for (i = 0; i < a->getLength(); ++i) {
- a->get(i, &obj);
+ Object obj = a->get(i);
if (obj.isNum()) {
// this uses the absolute value of the font size to match
// Acrobat's behavior
@@ -3921,17 +3845,15 @@
error(errSyntaxError, getPos(),
"Element of show/space array must be number or string");
}
- obj.free();
}
out->endStringOp(state);
if (!ocState) {
a = args[0].getArray();
for (i = 0; i < a->getLength(); ++i) {
- a->get(i, &obj);
+ Object obj = a->get(i);
if (obj.isString()) {
doIncCharCount(obj.getString());
}
- obj.free();
}
}
}
@@ -3947,7 +3869,6 @@
double x0, y0, x1, y1;
double oldCTM[6], newCTM[6];
double *mat;
- Object charProc;
Dict *resDict;
Parser *oldParser;
GfxState *savedState;
@@ -4031,7 +3952,7 @@
state->transformDelta(dx, dy, &ddx, &ddy);
if (!out->beginType3Char(state, curX + riseX, curY + riseY, ddx, ddy,
code, u, uLen)) {
- ((Gfx8BitFont *)font)->getCharProc(code, &charProc);
+ Object charProc = ((Gfx8BitFont *)font)->getCharProc(code);
if ((resDict = ((Gfx8BitFont *)font)->getResources())) {
pushResources(resDict);
}
@@ -4044,7 +3965,6 @@
if (resDict) {
popResources();
}
- charProc.free();
}
restoreStateStack(savedState);
// GfxState::restore() does *not* restore the current position,
@@ -4182,39 +4102,34 @@
void Gfx::opXObject(Object args[], int numArgs) {
char *name;
- Object obj1, obj2, obj3, refObj;
-#if OPI_SUPPORT
- Object opiDict;
-#endif
if (!ocState && !out->needCharCount()) {
return;
}
name = args[0].getName();
- if (!res->lookupXObject(name, &obj1)) {
+ Object obj1 = res->lookupXObject(name);
+ if (obj1.isNull()) {
return;
}
if (!obj1.isStream()) {
error(errSyntaxError, getPos(), "XObject '{0:s}' is wrong type", name);
- obj1.free();
return;
}
#if OPI_SUPPORT
- obj1.streamGetDict()->lookup("OPI", &opiDict);
+ Object opiDict = obj1.streamGetDict()->lookup("OPI");
if (opiDict.isDict()) {
out->opiBegin(state, opiDict.getDict());
}
#endif
- obj1.streamGetDict()->lookup("Subtype", &obj2);
+ Object obj2 = obj1.streamGetDict()->lookup("Subtype");
if (obj2.isName("Image")) {
if (out->needNonText()) {
- res->lookupXObjectNF(name, &refObj);
+ Object refObj = res->lookupXObjectNF(name);
doImage(&refObj, obj1.getStream(), gFalse);
- refObj.free();
}
} else if (obj2.isName("Form")) {
- res->lookupXObjectNF(name, &refObj);
+ Object refObj = res->lookupXObjectNF(name);
GBool shouldDoForm = gTrue;
std::set<int>::iterator drawingFormIt;
if (refObj.isRef()) {
@@ -4235,9 +4150,8 @@
if (refObj.isRef() && shouldDoForm) {
formsDrawing.erase(drawingFormIt);
}
- refObj.free();
} else if (obj2.isName("PS")) {
- obj1.streamGetDict()->lookup("Level1", &obj3);
+ Object obj3 = obj1.streamGetDict()->lookup("Level1");
out->psXObject(obj1.getStream(),
obj3.isStream() ? obj3.getStream() : (Stream *)NULL);
} else if (obj2.isName()) {
@@ -4245,14 +4159,11 @@
} else {
error(errSyntaxError, getPos(), "XObject subtype is missing or wrong type");
}
- obj2.free();
#if OPI_SUPPORT
if (opiDict.isDict()) {
out->opiEnd(state, opiDict.getDict());
}
- opiDict.free();
#endif
- obj1.free();
}
void Gfx::doImage(Object *ref, Stream *str, GBool inlineImg) {
@@ -4265,14 +4176,13 @@
GBool invert;
GfxColorSpace *colorSpace, *maskColorSpace;
GfxImageColorMap *maskColorMap;
- Object maskObj, smaskObj;
GBool haveColorKeyMask, haveExplicitMask, haveSoftMask;
int maskColors[2*gfxColorMaxComps];
int maskWidth, maskHeight;
GBool maskInvert;
GBool maskInterpolate;
Stream *maskStr;
- Object obj1, obj2;
+ Object obj1;
int i, n;
// get info from the stream
@@ -4285,84 +4195,72 @@
// check for optional content key
if (ref) {
- dict->lookupNF("OC", &obj1);
+ obj1 = dict->lookupNF("OC");
if (catalog->getOptContentConfig() && !catalog->getOptContentConfig()->optContentIsVisible(&obj1)) {
- obj1.free();
return;
}
- obj1.free();
}
// get size
- dict->lookup("Width", &obj1);
+ obj1 = dict->lookup("Width");
if (obj1.isNull()) {
- obj1.free();
- dict->lookup("W", &obj1);
+ obj1 = dict->lookup("W");
}
if (obj1.isInt())
width = obj1.getInt();
else if (obj1.isReal())
width = (int)obj1.getReal();
else
- goto err2;
- obj1.free();
- dict->lookup("Height", &obj1);
+ goto err1;
+ obj1 = dict->lookup("Height");
if (obj1.isNull()) {
- obj1.free();
- dict->lookup("H", &obj1);
+ obj1 = dict->lookup("H");
}
if (obj1.isInt())
height = obj1.getInt();
else if (obj1.isReal())
height = (int)obj1.getReal();
else
- goto err2;
- obj1.free();
+ goto err1;
if (width < 1 || height < 1)
goto err1;
// image interpolation
- dict->lookup("Interpolate", &obj1);
+ obj1 = dict->lookup("Interpolate");
if (obj1.isNull()) {
- obj1.free();
- dict->lookup("I", &obj1);
+ obj1 = dict->lookup("I");
}
if (obj1.isBool())
interpolate = obj1.getBool();
else
interpolate = gFalse;
- obj1.free();
maskInterpolate = gFalse;
// image or mask?
- dict->lookup("ImageMask", &obj1);
+ obj1 = dict->lookup("ImageMask");
if (obj1.isNull()) {
- obj1.free();
- dict->lookup("IM", &obj1);
+ obj1 = dict->lookup("IM");
}
mask = gFalse;
if (obj1.isBool())
mask = obj1.getBool();
else if (!obj1.isNull())
- goto err2;
- obj1.free();
+ goto err1;
// bit depth
if (bits == 0) {
- dict->lookup("BitsPerComponent", &obj1);
+ obj1 = dict->lookup("BitsPerComponent");
if (obj1.isNull()) {
- obj1.free();
- dict->lookup("BPC", &obj1);
+ obj1 = dict->lookup("BPC");
}
if (obj1.isInt()) {
bits = obj1.getInt();
} else if (mask) {
bits = 1;
} else {
- goto err2;
+ goto err1;
}
- obj1.free();
}
// display a mask
@@ -4372,22 +4270,20 @@
if (bits != 1)
goto err1;
invert = gFalse;
- dict->lookup("Decode", &obj1);
+ obj1 = dict->lookup("Decode");
if (obj1.isNull()) {
- obj1.free();
- dict->lookup("D", &obj1);
+ obj1 = dict->lookup("D");
}
if (obj1.isArray()) {
- obj1.arrayGet(0, &obj2);
+ Object obj2;
+ obj2 = obj1.arrayGet(0);
// Table 4.39 says /Decode must be [1 0] or [0 1]. Adobe
// accepts [1.0 0.0] as well.
if (obj2.isNum() && obj2.getNum() >= 0.9)
invert = gTrue;
- obj2.free();
} else if (!obj1.isNull()) {
- goto err2;
+ goto err1;
}
- obj1.free();
// if drawing is disabled, skip over inline image data
if (!ocState || !out->needNonText()) {
@@ -4412,24 +4308,19 @@
}
// get color space and color map
- dict->lookup("ColorSpace", &obj1);
+ obj1 = dict->lookup("ColorSpace");
if (obj1.isNull()) {
- obj1.free();
- dict->lookup("CS", &obj1);
+ obj1 = dict->lookup("CS");
}
if (obj1.isName() && inlineImg) {
- res->lookupColorSpace(obj1.getName(), &obj2);
+ Object obj2 = res->lookupColorSpace(obj1.getName());
if (!obj2.isNull()) {
- obj1.free();
- obj1 = obj2;
- } else {
- obj2.free();
+ obj1 = std::move(obj2);
}
}
if (!obj1.isNull()) {
- Object objIntent;
char *tempIntent = NULL;
- dict->lookup("Intent", &objIntent);
+ Object objIntent = dict->lookup("Intent");
if (objIntent.isName()) {
tempIntent = state->getRenderingIntent();
if (tempIntent != NULL) {
@@ -4442,48 +4333,38 @@
state->setRenderingIntent(tempIntent);
free(tempIntent);
}
- objIntent.free();
} else if (csMode == streamCSDeviceGray) {
- Object objCS;
- res->lookupColorSpace("DefaultGray", &objCS);
+ Object objCS = res->lookupColorSpace("DefaultGray");
if (objCS.isNull()) {
colorSpace = new GfxDeviceGrayColorSpace();
} else {
colorSpace = GfxColorSpace::parse(res, &objCS, out, state);
}
- objCS.free();
} else if (csMode == streamCSDeviceRGB) {
- Object objCS;
- res->lookupColorSpace("DefaultRGB", &objCS);
+ Object objCS = res->lookupColorSpace("DefaultRGB");
if (objCS.isNull()) {
colorSpace = new GfxDeviceRGBColorSpace();
} else {
colorSpace = GfxColorSpace::parse(res, &objCS, out, state);
}
- objCS.free();
} else if (csMode == streamCSDeviceCMYK) {
- Object objCS;
- res->lookupColorSpace("DefaultCMYK", &objCS);
+ Object objCS = res->lookupColorSpace("DefaultCMYK");
if (objCS.isNull()) {
colorSpace = new GfxDeviceCMYKColorSpace();
} else {
colorSpace = GfxColorSpace::parse(res, &objCS, out, state);
}
- objCS.free();
} else {
colorSpace = NULL;
}
- obj1.free();
if (!colorSpace) {
goto err1;
}
- dict->lookup("Decode", &obj1);
+ obj1 = dict->lookup("Decode");
if (obj1.isNull()) {
- obj1.free();
- dict->lookup("D", &obj1);
+ obj1 = dict->lookup("D");
}
GfxImageColorMap colorMap(bits, &obj1, colorSpace);
- obj1.free();
if (!colorMap.isOk()) {
goto err1;
}
@@ -4494,8 +4375,8 @@
maskWidth = maskHeight = 0; // make gcc happy
maskInvert = gFalse; // make gcc happy
maskColorMap = NULL; // make gcc happy
- dict->lookup("Mask", &maskObj);
- dict->lookup("SMask", &smaskObj);
+ Object maskObj = dict->lookup("Mask");
+ Object smaskObj = dict->lookup("SMask");
if (smaskObj.isStream()) {
// soft mask
if (inlineImg) {
@@ -4503,78 +4384,63 @@
}
maskStr = smaskObj.getStream();
maskDict = smaskObj.streamGetDict();
- maskDict->lookup("Width", &obj1);
+ obj1 = maskDict->lookup("Width");
if (obj1.isNull()) {
- obj1.free();
- maskDict->lookup("W", &obj1);
+ obj1 = maskDict->lookup("W");
}
if (!obj1.isInt()) {
- goto err2;
+ goto err1;
}
maskWidth = obj1.getInt();
- obj1.free();
- maskDict->lookup("Height", &obj1);
+ obj1 = maskDict->lookup("Height");
if (obj1.isNull()) {
- obj1.free();
- maskDict->lookup("H", &obj1);
+ obj1 = maskDict->lookup("H");
}
if (!obj1.isInt()) {
- goto err2;
+ goto err1;
}
maskHeight = obj1.getInt();
- obj1.free();
- maskDict->lookup("Interpolate", &obj1);
+ obj1 = maskDict->lookup("Interpolate");
if (obj1.isNull()) {
- obj1.free();
- maskDict->lookup("I", &obj1);
+ obj1 = maskDict->lookup("I");
}
if (obj1.isBool())
maskInterpolate = obj1.getBool();
else
maskInterpolate = gFalse;
- obj1.free();
- maskDict->lookup("BitsPerComponent", &obj1);
+ obj1 = maskDict->lookup("BitsPerComponent");
if (obj1.isNull()) {
- obj1.free();
- maskDict->lookup("BPC", &obj1);
+ obj1 = maskDict->lookup("BPC");
}
if (!obj1.isInt()) {
- goto err2;
+ goto err1;
}
maskBits = obj1.getInt();
- obj1.free();
- maskDict->lookup("ColorSpace", &obj1);
+ obj1 = maskDict->lookup("ColorSpace");
if (obj1.isNull()) {
- obj1.free();
- maskDict->lookup("CS", &obj1);
+ obj1 = maskDict->lookup("CS");
}
if (obj1.isName()) {
- res->lookupColorSpace(obj1.getName(), &obj2);
+ Object obj2 = res->lookupColorSpace(obj1.getName());
if (!obj2.isNull()) {
- obj1.free();
- obj1 = obj2;
- } else {
- obj2.free();
+ obj1 = std::move(obj2);
}
}
maskColorSpace = GfxColorSpace::parse(NULL, &obj1, out, state);
- obj1.free();
if (!maskColorSpace || maskColorSpace->getMode() != csDeviceGray) {
goto err1;
}
- maskDict->lookup("Decode", &obj1);
+ obj1 = maskDict->lookup("Decode");
if (obj1.isNull()) {
- obj1.free();
- maskDict->lookup("D", &obj1);
+ obj1 = maskDict->lookup("D");
}
maskColorMap = new GfxImageColorMap(maskBits, &obj1, maskColorSpace);
- obj1.free();
if (!maskColorMap->isOk()) {
delete maskColorMap;
goto err1;
}
// handle the Matte entry
- maskDict->lookup("Matte", &obj1);
+ obj1 = maskDict->lookup("Matte");
if (obj1.isArray()) {
if (obj1.getArray()->getLength() != colorSpace->getNComps()) {
error(errSyntaxError, -1, "Matte entry should have {0:d} components but has {1:d}",
@@ -4585,29 +4451,26 @@
} else {
GfxColor matteColor;
for (i = 0; i < colorSpace->getNComps(); i++) {
- obj1.getArray()->get(i, &obj2);
+ Object obj2 = obj1.getArray()->get(i);
if (!obj2.isNum()) {
- obj2.free();
error(errSyntaxError, -1, "Matte entry {0:d} should be a number but it's of type {1:d}", i, obj2.getType());
break;
}
matteColor.c[i] = dblToCol(obj2.getNum());
- obj2.free();
}
if (i == colorSpace->getNComps()) {
maskColorMap->setMatteColor(&matteColor);
}
}
}
- obj1.free();
haveSoftMask = gTrue;
} else if (maskObj.isArray()) {
// color key mask
for (i = 0;
i < maskObj.arrayGetLength() && i < 2*gfxColorMaxComps;
++i) {
- maskObj.arrayGet(i, &obj1);
+ obj1 = maskObj.arrayGet(i);
if (obj1.isInt()) {
maskColors[i] = obj1.getInt();
} else if (obj1.isReal()) {
@@ -4615,10 +4478,8 @@
maskColors[i] = (int) obj1.getReal();
} else {
error(errSyntaxError, -1, "Mask entry should be an integer but it's of type {0:d}", obj1.getType());
- obj1.free();
goto err1;
}
- obj1.free();
}
haveColorKeyMask = gTrue;
} else if (maskObj.isStream()) {
@@ -4628,63 +4489,52 @@
}
maskStr = maskObj.getStream();
maskDict = maskObj.streamGetDict();
- maskDict->lookup("Width", &obj1);
+ obj1 = maskDict->lookup("Width");
if (obj1.isNull()) {
- obj1.free();
- maskDict->lookup("W", &obj1);
+ obj1 = maskDict->lookup("W");
}
if (!obj1.isInt()) {
- goto err2;
+ goto err1;
}
maskWidth = obj1.getInt();
- obj1.free();
- maskDict->lookup("Height", &obj1);
+ obj1 = maskDict->lookup("Height");
if (obj1.isNull()) {
- obj1.free();
- maskDict->lookup("H", &obj1);
+ obj1 = maskDict->lookup("H");
}
if (!obj1.isInt()) {
- goto err2;
+ goto err1;
}
maskHeight = obj1.getInt();
- obj1.free();
- maskDict->lookup("Interpolate", &obj1);
+ obj1 = maskDict->lookup("Interpolate");
if (obj1.isNull()) {
- obj1.free();
- maskDict->lookup("I", &obj1);
+ obj1 = maskDict->lookup("I");
}
if (obj1.isBool())
maskInterpolate = obj1.getBool();
else
maskInterpolate = gFalse;
- obj1.free();
- maskDict->lookup("ImageMask", &obj1);
+ obj1 = maskDict->lookup("ImageMask");
if (obj1.isNull()) {
- obj1.free();
- maskDict->lookup("IM", &obj1);
+ obj1 = maskDict->lookup("IM");
}
if (!obj1.isBool() || !obj1.getBool()) {
- goto err2;
+ goto err1;
}
- obj1.free();
maskInvert = gFalse;
- maskDict->lookup("Decode", &obj1);
+ obj1 = maskDict->lookup("Decode");
if (obj1.isNull()) {
- obj1.free();
- maskDict->lookup("D", &obj1);
+ obj1 = maskDict->lookup("D");
}
if (obj1.isArray()) {
- obj1.arrayGet(0, &obj2);
+ Object obj2 = obj1.arrayGet(0);
// Table 4.39 says /Decode must be [1 0] or [0 1]. Adobe
// accepts [1.0 0.0] as well.
if (obj2.isNum() && obj2.getNum() >= 0.9) {
maskInvert = gTrue;
}
- obj2.free();
} else if (!obj1.isNull()) {
- goto err2;
+ goto err1;
}
- obj1.free();
haveExplicitMask = gTrue;
}
@@ -4712,9 +4562,6 @@
haveColorKeyMask ? maskColors : (int *)NULL, inlineImg);
}
}
-
- maskObj.free();
- smaskObj.free();
}
if ((i = width * height) > 1000) {
@@ -4724,8 +4571,6 @@
return;
- err2:
- obj1.free();
err1:
error(errSyntaxError, getPos(), "Bad image parameters");
}
@@ -4733,22 +4578,22 @@
GBool Gfx::checkTransparencyGroup(Dict *resDict) {
// check the effect of compositing objects as a group:
// look for ExtGState entries with ca != 1 or CA != 1 or BM != normal
- Object extGStates;
GBool transpGroup = gFalse;
double opac;
if (resDict == NULL)
return gFalse;
pushResources(resDict);
- resDict->lookup("ExtGState", &extGStates);
+ Object extGStates = resDict->lookup("ExtGState");
if (extGStates.isDict()) {
Dict *dict = extGStates.getDict();
for (int i = 0; i < dict->getLength() && !transpGroup; i++) {
- Object obj1, obj2;
GfxBlendMode mode;
- if (res->lookupGState(dict->getKey(i), &obj1) && obj1.isDict()) {
- if (!obj1.dictLookup("BM", &obj2)->isNull()) {
+ Object obj1 = res->lookupGState(dict->getKey(i));
+ if (obj1.isDict()) {
+ Object obj2 = obj1.dictLookup("BM");
+ if (!obj2.isNull()) {
if (state->parseBlendMode(&obj2, &mode)) {
if (mode != gfxBlendNormal)
transpGroup = gTrue;
@@ -4756,38 +4601,35 @@
error(errSyntaxError, getPos(), "Invalid blend mode in ExtGState");
}
}
- obj2.free();
- if (obj1.dictLookup("ca", &obj2)->isNum()) {
+ obj2 = obj1.dictLookup("ca");
+ if (obj2.isNum()) {
opac = obj2.getNum();
opac = opac < 0 ? 0 : opac > 1 ? 1 : opac;
if (opac != 1)
transpGroup = gTrue;
}
- obj2.free();
- if (obj1.dictLookup("CA", &obj2)->isNum()) {
+ obj2 = obj1.dictLookup("CA");
+ if (obj2.isNum()) {
opac = obj2.getNum();
opac = opac < 0 ? 0 : opac > 1 ? 1 : opac;
if (opac != 1)
transpGroup = gTrue;
}
- obj2.free();
// alpha is shape
- if (!transpGroup && obj1.dictLookup("AIS", &obj2)->isBool()) {
+ obj2 = obj1.dictLookup("AIS");
+ if (!transpGroup && obj2.isBool()) {
transpGroup = obj2.getBool();
}
- obj2.free();
// soft mask
- if (!transpGroup && !obj1.dictLookup("SMask", &obj2)->isNull()) {
+ obj2 = obj1.dictLookup("SMask");
+ if (!transpGroup && !obj2.isNull()) {
if (!obj2.isName("None")) {
transpGroup = gTrue;
}
}
- obj2.free();
}
- obj1.free();
}
}
- extGStates.free();
popResources();
return transpGroup;
}
@@ -4796,12 +4638,10 @@
Dict *dict;
GBool transpGroup, isolated, knockout;
GfxColorSpace *blendingColorSpace;
- Object matrixObj, bboxObj;
double m[6], bbox[4];
- Object resObj;
Dict *resDict;
GBool ocSaved;
- Object obj1, obj2, obj3;
+ Object obj1;
int i;
// check for excessive recursion
@@ -4813,88 +4653,79 @@
dict = str->streamGetDict();
// check form type
- dict->lookup("FormType", &obj1);
+ obj1 = dict->lookup("FormType");
if (!(obj1.isNull() || (obj1.isInt() && obj1.getInt() == 1))) {
error(errSyntaxError, getPos(), "Unknown form type");
}
- obj1.free();
// check for optional content key
ocSaved = ocState;
- dict->lookupNF("OC", &obj1);
+ obj1 = dict->lookupNF("OC");
if (catalog->getOptContentConfig() && !catalog->getOptContentConfig()->optContentIsVisible(&obj1)) {
- obj1.free();
if (out->needCharCount()) {
ocState = gFalse;
} else {
return;
}
}
- obj1.free();
// get bounding box
- dict->lookup("BBox", &bboxObj);
+ Object bboxObj = dict->lookup("BBox");
if (!bboxObj.isArray()) {
- bboxObj.free();
error(errSyntaxError, getPos(), "Bad form bounding box");
ocState = ocSaved;
return;
}
for (i = 0; i < 4; ++i) {
- bboxObj.arrayGet(i, &obj1);
+ obj1 = bboxObj.arrayGet(i);
if (likely(obj1.isNum())) {
bbox[i] = obj1.getNum();
- obj1.free();
} else {
- obj1.free();
error(errSyntaxError, getPos(), "Bad form bounding box value");
return;
}
}
- bboxObj.free();
// get matrix
- dict->lookup("Matrix", &matrixObj);
+ Object matrixObj = dict->lookup("Matrix");
if (matrixObj.isArray()) {
for (i = 0; i < 6; ++i) {
- matrixObj.arrayGet(i, &obj1);
+ obj1 = matrixObj.arrayGet(i);
if (likely(obj1.isNum())) m[i] = obj1.getNum();
else m[i] = 0;
- obj1.free();
}
} else {
m[0] = 1; m[1] = 0;
m[2] = 0; m[3] = 1;
m[4] = 0; m[5] = 0;
}
- matrixObj.free();
// get resources
- dict->lookup("Resources", &resObj);
+ Object resObj = dict->lookup("Resources");
resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL;
// check for a transparency group
transpGroup = isolated = knockout = gFalse;
blendingColorSpace = NULL;
- if (dict->lookup("Group", &obj1)->isDict()) {
- if (obj1.dictLookup("S", &obj2)->isName("Transparency")) {
- if (!obj1.dictLookup("CS", &obj3)->isNull()) {
+ obj1 = dict->lookup("Group");
+ if (obj1.isDict()) {
+ Object obj2 = obj1.dictLookup("S");
+ if (obj2.isName("Transparency")) {
+ Object obj3 = obj1.dictLookup("CS");
+ if (!obj3.isNull()) {
blendingColorSpace = GfxColorSpace::parse(res, &obj3, out, state);
}
- obj3.free();
- if (obj1.dictLookup("I", &obj3)->isBool()) {
+ obj3 = obj1.dictLookup("I");
+ if (obj3.isBool()) {
isolated = obj3.getBool();
}
- obj3.free();
- if (obj1.dictLookup("K", &obj3)->isBool()) {
+ obj3 = obj1.dictLookup("K");
+ if (obj3.isBool()) {
knockout = obj3.getBool();
}
- obj3.free();
transpGroup = isolated || out->checkTransparencyGroup(state, knockout) || checkTransparencyGroup(resDict);
}
- obj2.free();
}
- obj1.free();
// draw it
++formDepth;
@@ -4905,7 +4736,6 @@
if (blendingColorSpace) {
delete blendingColorSpace;
}
- resObj.free();
ocState = ocSaved;
}
@@ -5046,45 +4876,37 @@
}
Stream *Gfx::buildImageStream() {
- Object dict;
- Object obj;
char *key;
Stream *str;
// build dictionary
- dict.initDict(xref);
- parser->getObj(&obj);
+ Object dict(new Dict(xref));
+ Object obj = parser->getObj();
while (!obj.isCmd("ID") && !obj.isEOF()) {
if (!obj.isName()) {
error(errSyntaxError, getPos(), "Inline image dictionary key must be a name object");
- obj.free();
} else {
key = copyString(obj.getName());
- obj.free();
- parser->getObj(&obj);
+ obj = parser->getObj();
if (obj.isEOF() || obj.isError()) {
gfree(key);
break;
}
- dict.dictAdd(key, &obj);
+ dict.dictAdd(key, std::move(obj));
}
- parser->getObj(&obj);
+ obj = parser->getObj();
}
if (obj.isEOF()) {
error(errSyntaxError, getPos(), "End of file in inline image");
- obj.free();
- dict.free();
return NULL;
}
- obj.free();
// make stream
if (parser->getStream()) {
- str = new EmbedStream(parser->getStream(), &dict, gFalse, 0);
- str = str->addFilters(&dict);
+ str = new EmbedStream(parser->getStream(), std::move(dict), gFalse, 0);
+ str = str->addFilters(str->getDict());
} else {
str = NULL;
- dict.free();
}
return str;
@@ -5177,27 +4999,25 @@
error(errSyntaxError, getPos(), "Unexpected MC Type: {0:d}", args[1].getType());
}
char* name1 = args[1].getName();
- Object markedContent;
MarkedContentStack *mc = mcStack;
mc->kind = gfxMCOptionalContent;
- if ( res->lookupMarkedContentNF( name1, &markedContent ) ) {
+ Object markedContent = res->lookupMarkedContentNF( name1 );
+ if (!markedContent.isNull()) {
bool visible = contentConfig->optContentIsVisible(&markedContent);
mc->ocSuppressed = !(visible);
} else {
error(errSyntaxError, getPos(), "DID NOT find {0:s}", name1);
}
- markedContent.free();
} else {
error(errSyntaxError, getPos(), "insufficient arguments for Marked Content");
}
} else if (args[0].isName("Span") && numArgs == 2 && args[1].isDict()) {
- Object obj;
- if (args[1].dictLookup("ActualText", &obj)->isString()) {
+ Object obj = args[1].dictLookup("ActualText");
+ if (obj.isString()) {
out->beginActualText(state, obj.getString());
MarkedContentStack *mc = mcStack;
mc->kind = gfxMCActualText;
}
- obj.free();
}
if (printCommands) {
@@ -5271,7 +5091,6 @@
void Gfx::drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor,
double xMin, double yMin, double xMax, double yMax, int rotate) {
Dict *dict, *resDict;
- Object matrixObj, bboxObj, resObj, obj1;
double formXMin, formYMin, formXMax, formYMax;
double x, y, sx, sy, tx, ty;
double m[6], bbox[4];
@@ -5319,37 +5138,29 @@
dict = str->streamGetDict();
// get the form bounding box
- dict->lookup("BBox", &bboxObj);
+ Object bboxObj = dict->lookup("BBox");
if (!bboxObj.isArray()) {
- bboxObj.free();
error(errSyntaxError, getPos(), "Bad form bounding box");
return;
}
for (i = 0; i < 4; ++i) {
- bboxObj.arrayGet(i, &obj1);
+ Object obj1 = bboxObj.arrayGet(i);
if (likely(obj1.isNum())) {
bbox[i] = obj1.getNum();
- obj1.free();
} else {
- obj1.free();
- bboxObj.free();
error(errSyntaxError, getPos(), "Bad form bounding box value");
return;
}
}
- bboxObj.free();
// get the form matrix
- dict->lookup("Matrix", &matrixObj);
+ Object matrixObj = dict->lookup("Matrix");
if (matrixObj.isArray() && matrixObj.arrayGetLength() >= 6) {
for (i = 0; i < 6; ++i) {
- matrixObj.arrayGet(i, &obj1);
+ Object obj1 = matrixObj.arrayGet(i);
if (likely(obj1.isNum())) {
m[i] = obj1.getNum();
- obj1.free();
} else {
- obj1.free();
- matrixObj.free();
error(errSyntaxError, getPos(), "Bad form matrix");
return;
}
@@ -5359,7 +5170,6 @@
m[2] = 0; m[3] = 1;
m[4] = 0; m[5] = 0;
}
- matrixObj.free();
// transform the four corners of the form bbox to default user
// space, and construct the transformed bbox
@@ -5432,13 +5242,11 @@
m[5] = m[5] * sy + ty;
// get the resources
- dict->lookup("Resources", &resObj);
+ Object resObj = dict->lookup("Resources");
resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL;
// draw it
drawForm(str, resDict, m, bbox);
-
- resObj.free();
}
// draw the border
diff --git a/poppler/Gfx.h b/poppler/Gfx.h
index a82f9f4..00eaec4 100644
--- a/poppler/Gfx.h
+++ b/poppler/Gfx.h
@@ -17,7 +17,7 @@
// Copyright (C) 2007 Iñigo Martínez <inigomartinez@gmail.com>
// Copyright (C) 2008 Brad Hards <bradh@kde.org>
// Copyright (C) 2008, 2010 Carlos Garcia Campos <carlosgc@gnome.org>
-// Copyright (C) 2009-2013 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009-2013, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2009, 2010, 2012, 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2010 David Benjamin <davidben@mit.edu>
// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com>
@@ -113,14 +113,14 @@
~GfxResources();
GfxFont *lookupFont(char *name);
- GBool lookupXObject(char *name, Object *obj);
- GBool lookupXObjectNF(char *name, Object *obj);
- GBool lookupMarkedContentNF(char *name, Object *obj);
- void lookupColorSpace(const char *name, Object *obj);
+ Object lookupXObject(char *name);
+ Object lookupXObjectNF(char *name);
+ Object lookupMarkedContentNF(char *name);
+ Object lookupColorSpace(const char *name);
GfxPattern *lookupPattern(char *name, OutputDev *out, GfxState *state);
GfxShading *lookupShading(char *name, OutputDev *out, GfxState *state);
- GBool lookupGState(char *name, Object *obj);
- GBool lookupGStateNF(char *name, Object *obj);
+ Object lookupGState(char *name);
+ Object lookupGStateNF(char *name);
GfxResources *getNext() { return next; }
diff --git a/poppler/GfxFont.cc b/poppler/GfxFont.cc
index b59ec06..183f049 100644
--- a/poppler/GfxFont.cc
+++ b/poppler/GfxFont.cc
@@ -210,15 +210,13 @@
Ref embFontIDA;
GfxFontType typeA;
GfxFont *font;
- Object obj1;
// get base font name
nameA = NULL;
- fontDict->lookup("BaseFont", &obj1);
+ Object obj1 = fontDict->lookup("BaseFont");
if (obj1.isName()) {
nameA = new GooString(obj1.getName());
}
- obj1.free();
// get embedded font ID and font type
typeA = getFontType(xref, fontDict, &embFontIDA);
@@ -290,14 +288,13 @@
GfxFontType t, expectedType;
FoFiIdentifierType fft;
Dict *fontDict2;
- Object subtype, fontDesc, obj1, obj2, obj3, obj4;
GBool isType0, err;
t = fontUnknownType;
embID->num = embID->gen = -1;
err = gFalse;
- fontDict->lookup("Subtype", &subtype);
+ Object subtype = fontDict->lookup("Subtype");
expectedType = fontUnknownType;
isType0 = gFalse;
if (subtype.isName("Type1") || subtype.isName("MMType1")) {
@@ -314,44 +311,45 @@
error(errSyntaxWarning, -1, "Unknown font type: '{0:s}'",
subtype.isName() ? subtype.getName() : "???");
}
- subtype.free();
fontDict2 = fontDict;
- if (fontDict->lookup("DescendantFonts", &obj1)->isArray()) {
+ Object obj1 = fontDict->lookup("DescendantFonts");
+ Object obj2; // Do not move to inside the if
+ // we need it around so that fontDict2 remains valid
+ if (obj1.isArray()) {
if (obj1.arrayGetLength() == 0) {
error(errSyntaxWarning, -1, "Empty DescendantFonts array in font");
- obj2.initNull();
- } else if (obj1.arrayGet(0, &obj2)->isDict()) {
- if (!isType0) {
- error(errSyntaxWarning, -1, "Non-CID font with DescendantFonts array");
- }
- fontDict2 = obj2.getDict();
- fontDict2->lookup("Subtype", &subtype);
- if (subtype.isName("CIDFontType0")) {
- if (isType0) {
- expectedType = fontCIDType0;
+ } else {
+ obj2 = obj1.arrayGet(0);
+ if (obj2.isDict()) {
+ if (!isType0) {
+ error(errSyntaxWarning, -1, "Non-CID font with DescendantFonts array");
}
- } else if (subtype.isName("CIDFontType2")) {
- if (isType0) {
- expectedType = fontCIDType2;
+ fontDict2 = obj2.getDict();
+ subtype = fontDict2->lookup("Subtype");
+ if (subtype.isName("CIDFontType0")) {
+ if (isType0) {
+ expectedType = fontCIDType0;
+ }
+ } else if (subtype.isName("CIDFontType2")) {
+ if (isType0) {
+ expectedType = fontCIDType2;
+ }
}
}
- subtype.free();
}
- } else {
- obj2.initNull();
}
- if (fontDict2->lookup("FontDescriptor", &fontDesc)->isDict()) {
- if (fontDesc.dictLookupNF("FontFile", &obj3)->isRef()) {
+ Object fontDesc = fontDict2->lookup("FontDescriptor");
+ if (fontDesc.isDict()) {
+ Object obj3 = fontDesc.dictLookupNF("FontFile");
+ if (obj3.isRef()) {
*embID = obj3.getRef();
if (expectedType != fontType1) {
err = gTrue;
}
}
- obj3.free();
- if (embID->num == -1 &&
- fontDesc.dictLookupNF("FontFile2", &obj3)->isRef()) {
+ if (embID->num == -1 && (obj3 = fontDesc.dictLookupNF("FontFile2"), obj3.isRef())) {
*embID = obj3.getRef();
if (isType0) {
expectedType = fontCIDType2;
@@ -359,12 +357,11 @@
err = gTrue;
}
}
- obj3.free();
- if (embID->num == -1 &&
- fontDesc.dictLookupNF("FontFile3", &obj3)->isRef()) {
+ if (embID->num == -1 && (obj3 = fontDesc.dictLookupNF("FontFile3"), obj3.isRef())) {
*embID = obj3.getRef();
- if (obj3.fetch(xref, &obj4)->isStream()) {
- obj4.streamGetDict()->lookup("Subtype", &subtype);
+ Object obj4 = obj3.fetch(xref);
+ if (obj4.isStream()) {
+ subtype = obj4.streamGetDict()->lookup("Subtype");
if (subtype.isName("Type1")) {
if (expectedType != fontType1) {
err = gTrue;
@@ -405,18 +402,14 @@
error(errSyntaxError, -1, "Unknown font type '{0:s}'",
subtype.isName() ? subtype.getName() : "???");
}
- subtype.free();
}
- obj4.free();
}
- obj3.free();
}
- fontDesc.free();
t = fontUnknownType;
if (embID->num >= 0) {
- obj3.initRef(embID->num, embID->gen);
- obj3.fetch(xref, &obj4);
+ Object obj3(embID->num, embID->gen);
+ Object obj4 = obj3.fetch(xref);
if (obj4.isStream()) {
obj4.streamReset();
fft = FoFiIdentifier::identifyStream(&readFromStream, obj4.getStream());
@@ -447,8 +440,6 @@
break;
}
}
- obj4.free();
- obj3.free();
}
if (t == fontUnknownType) {
@@ -464,53 +455,46 @@
"Mismatch between font type and embedded font file");
}
- obj2.free();
- obj1.free();
-
return t;
}
void GfxFont::readFontDescriptor(XRef *xref, Dict *fontDict) {
- Object obj1, obj2, obj3, obj4;
double t;
- int i;
// assume Times-Roman by default (for substitution purposes)
flags = fontSerif;
missingWidth = 0;
- if (fontDict->lookup("FontDescriptor", &obj1)->isDict()) {
+ Object obj1 = fontDict->lookup("FontDescriptor");
+ if (obj1.isDict()) {
// get flags
- if (obj1.dictLookup("Flags", &obj2)->isInt()) {
+ Object obj2 = obj1.dictLookup("Flags");
+ if (obj2.isInt()) {
flags = obj2.getInt();
}
- obj2.free();
// get name
- obj1.dictLookup("FontName", &obj2);
+ obj2 = obj1.dictLookup("FontName");
if (obj2.isName()) {
embFontName = new GooString(obj2.getName());
}
- obj2.free();
if (embFontName == NULL) {
// get name with typo
- obj1.dictLookup("Fontname", &obj2);
+ obj2 = obj1.dictLookup("Fontname");
if (obj2.isName()) {
embFontName = new GooString(obj2.getName());
error(errSyntaxWarning, -1, "The file uses Fontname instead of FontName please notify the creator that the file is broken");
}
- obj2.free();
}
// get family
- obj1.dictLookup("FontFamily", &obj2);
+ obj2 = obj1.dictLookup("FontFamily");
if (obj2.isString()) family = new GooString(obj2.getString());
- obj2.free();
// get stretch
- obj1.dictLookup("FontStretch", &obj2);
+ obj2 = obj1.dictLookup("FontStretch");
if (obj2.isName()) {
if (strcmp(obj2.getName(), "UltraCondensed") == 0) stretch = UltraCondensed;
else if (strcmp(obj2.getName(), "ExtraCondensed") == 0) stretch = ExtraCondensed;
@@ -523,10 +507,9 @@
else if (strcmp(obj2.getName(), "UltraExpanded") == 0) stretch = UltraExpanded;
else error(errSyntaxWarning, -1, "Invalid Font Stretch");
}
- obj2.free();
// get weight
- obj1.dictLookup("FontWeight", &obj2);
+ obj2 = obj1.dictLookup("FontWeight");
if (obj2.isNum()) {
if (obj2.getNum() == 100) weight = W100;
else if (obj2.getNum() == 200) weight = W200;
@@ -539,17 +522,15 @@
else if (obj2.getNum() == 900) weight = W900;
else error(errSyntaxWarning, -1, "Invalid Font Weight");
}
- obj2.free();
// look for MissingWidth
- obj1.dictLookup("MissingWidth", &obj2);
+ obj2 = obj1.dictLookup("MissingWidth");
if (obj2.isNum()) {
missingWidth = obj2.getNum();
}
- obj2.free();
// get Ascent and Descent
- obj1.dictLookup("Ascent", &obj2);
+ obj2 = obj1.dictLookup("Ascent");
if (obj2.isNum()) {
t = 0.001 * obj2.getNum();
// some broken font descriptors specify a negative ascent
@@ -562,8 +543,7 @@
ascent = t;
}
}
- obj2.free();
- obj1.dictLookup("Descent", &obj2);
+ obj2 = obj1.dictLookup("Descent");
if (obj2.isNum()) {
t = 0.001 * obj2.getNum();
// some broken font descriptors specify a positive descent
@@ -575,36 +555,31 @@
descent = t;
}
}
- obj2.free();
// font FontBBox
- if (obj1.dictLookup("FontBBox", &obj2)->isArray()) {
- for (i = 0; i < 4 && i < obj2.arrayGetLength(); ++i) {
- if (obj2.arrayGet(i, &obj3)->isNum()) {
+ obj2 = obj1.dictLookup("FontBBox");
+ if (obj2.isArray()) {
+ for (int i = 0; i < 4 && i < obj2.arrayGetLength(); ++i) {
+ Object obj3 = obj2.arrayGet(i);
+ if (obj3.isNum()) {
fontBBox[i] = 0.001 * obj3.getNum();
}
- obj3.free();
}
}
- obj2.free();
-
}
- obj1.free();
}
CharCodeToUnicode *GfxFont::readToUnicodeCMap(Dict *fontDict, int nBits,
CharCodeToUnicode *ctu) {
GooString *buf;
- Object obj1;
- if (!fontDict->lookup("ToUnicode", &obj1)->isStream()) {
- obj1.free();
+ Object obj1 = fontDict->lookup("ToUnicode");
+ if (!obj1.isStream()) {
return NULL;
}
buf = new GooString();
obj1.getStream()->fillGooString(buf);
obj1.streamClose();
- obj1.free();
if (ctu) {
ctu->mergeCMap(buf, nBits);
} else {
@@ -620,7 +595,6 @@
SysFontType sysFontType;
GooString *path, *base14Name, *substName;
PSFontParam16 *psFont16;
- Object refObj, embFontObj;
int substIdx, fontNum;
GBool embed;
@@ -631,14 +605,12 @@
//----- embedded font
if (embFontID.num >= 0) {
embed = gTrue;
- refObj.initRef(embFontID.num, embFontID.gen);
- refObj.fetch(xref, &embFontObj);
+ Object refObj(embFontID.num, embFontID.gen);
+ Object embFontObj = refObj.fetch(xref);
if (!embFontObj.isStream()) {
error(errSyntaxError, -1, "Embedded font object is wrong type");
embed = gFalse;
}
- embFontObj.free();
- refObj.free();
if (embed) {
if (ps) {
switch (type) {
@@ -894,15 +866,12 @@
char *GfxFont::readEmbFontFile(XRef *xref, int *len) {
char *buf;
- Object obj1, obj2;
Stream *str;
- obj1.initRef(embFontID.num, embFontID.gen);
- obj1.fetch(xref, &obj2);
+ Object obj1(embFontID.num, embFontID.gen);
+ Object obj2 = obj1.fetch(xref);
if (!obj2.isStream()) {
error(errSyntaxError, -1, "Embedded font file is not a stream");
- obj2.free();
- obj1.free();
embFontID.num = -1;
*len = 0;
return NULL;
@@ -912,9 +881,6 @@
buf = (char*)str->toUnsignedChars(len);
str->close();
- obj2.free();
- obj1.free();
-
return buf;
}
@@ -995,24 +961,20 @@
// Returns gTrue if the font has character names like xx or Axx which
// should be parsed for hex or decimal values.
static GBool testForNumericNames(Dict *fontDict, GBool hex) {
- Object enc, diff, obj;
GBool numeric = gTrue;
- fontDict->lookup("Encoding", &enc);
+ Object enc = fontDict->lookup("Encoding");
if (!enc.isDict()) {
- enc.free();
return gFalse;
}
- enc.dictLookup("Differences", &diff);
- enc.free();
+ Object diff = enc.dictLookup("Differences");
if (!diff.isArray()) {
- diff.free();
return gFalse;
}
for (int i = 0; i < diff.arrayGetLength() && numeric; ++i) {
- diff.arrayGet(i, &obj);
+ Object obj = diff.arrayGet(i);
if (obj.isInt()) {
// All sequences must start between character codes 0 and 5.
if (obj.getInt() > 5)
@@ -1024,10 +986,8 @@
} else {
numeric = gFalse;
}
- obj.free();
}
- diff.free();
return numeric;
}
@@ -1052,7 +1012,7 @@
double mul;
int firstChar, lastChar;
Gushort w;
- Object obj1, obj2, obj3;
+ Object obj1;
int n, i, a, b, m;
refCnt = 1;
@@ -1130,34 +1090,36 @@
// get font matrix
fontMat[0] = fontMat[3] = 1;
fontMat[1] = fontMat[2] = fontMat[4] = fontMat[5] = 0;
- if (fontDict->lookup("FontMatrix", &obj1)->isArray()) {
+ obj1 = fontDict->lookup("FontMatrix");
+ if (obj1.isArray()) {
for (i = 0; i < 6 && i < obj1.arrayGetLength(); ++i) {
- if (obj1.arrayGet(i, &obj2)->isNum()) {
+ Object obj2 = obj1.arrayGet(i);
+ if (obj2.isNum()) {
fontMat[i] = obj2.getNum();
}
- obj2.free();
}
}
- obj1.free();
// get Type 3 bounding box, font definition, and resources
if (type == fontType3) {
- if (fontDict->lookup("FontBBox", &obj1)->isArray()) {
+ obj1 = fontDict->lookup("FontBBox");
+ if (obj1.isArray()) {
for (i = 0; i < 4 && i < obj1.arrayGetLength(); ++i) {
- if (obj1.arrayGet(i, &obj2)->isNum()) {
+ Object obj2 = obj1.arrayGet(i);
+ if (obj2.isNum()) {
fontBBox[i] = obj2.getNum();
}
- obj2.free();
}
}
- obj1.free();
- if (!fontDict->lookup("CharProcs", &charProcs)->isDict()) {
+ charProcs = fontDict->lookup("CharProcs");
+ if (!charProcs.isDict()) {
error(errSyntaxError, -1,
"Missing or invalid CharProcs dictionary in Type 3 font");
- charProcs.free();
+ charProcs.setToNull();
}
- if (!fontDict->lookup("Resources", &resources)->isDict()) {
- resources.free();
+ resources = fontDict->lookup("Resources");
+ if (!resources.isDict()) {
+ resources.setToNull();
}
}
@@ -1180,9 +1142,9 @@
usesMacRomanEnc = gFalse;
baseEnc = NULL;
baseEncFromFontFile = gFalse;
- fontDict->lookup("Encoding", &obj1);
+ obj1 = fontDict->lookup("Encoding");
if (obj1.isDict()) {
- obj1.dictLookup("BaseEncoding", &obj2);
+ Object obj2 = obj1.dictLookup("BaseEncoding");
if (obj2.isName("MacRomanEncoding")) {
hasEncoding = gTrue;
usesMacRomanEnc = gTrue;
@@ -1194,7 +1156,6 @@
hasEncoding = gTrue;
baseEnc = winAnsiEncoding;
}
- obj2.free();
} else if (obj1.isName("MacRomanEncoding")) {
hasEncoding = gTrue;
usesMacRomanEnc = gTrue;
@@ -1298,13 +1259,13 @@
// merge differences into encoding
if (obj1.isDict()) {
- obj1.dictLookup("Differences", &obj2);
+ Object obj2 = obj1.dictLookup("Differences");
if (obj2.isArray()) {
encodingName->Set("Custom");
hasEncoding = gTrue;
code = 0;
for (i = 0; i < obj2.arrayGetLength(); ++i) {
- obj2.arrayGet(i, &obj3);
+ Object obj3 = obj2.arrayGet(i);
if (obj3.isInt()) {
code = obj3.getInt();
} else if (obj3.isName()) {
@@ -1321,18 +1282,11 @@
"Wrong type in font encoding resource differences ({0:s})",
obj3.getTypeName());
}
- obj3.free();
}
}
- obj2.free();
}
- obj1.free();
- if (ffT1) {
- delete ffT1;
- }
- if (ffT1C) {
- delete ffT1C;
- }
+ delete ffT1;
+ delete ffT1C;
//----- build the mapping to Unicode -----
@@ -1450,34 +1404,31 @@
}
// use widths from font dict, if present
- fontDict->lookup("FirstChar", &obj1);
+ obj1 = fontDict->lookup("FirstChar");
firstChar = obj1.isInt() ? obj1.getInt() : 0;
- obj1.free();
if (firstChar < 0 || firstChar > 255) {
firstChar = 0;
}
- fontDict->lookup("LastChar", &obj1);
+ obj1 = fontDict->lookup("LastChar");
lastChar = obj1.isInt() ? obj1.getInt() : 255;
- obj1.free();
if (lastChar < 0 || lastChar > 255) {
lastChar = 255;
}
mul = (type == fontType3) ? fontMat[0] : 0.001;
- fontDict->lookup("Widths", &obj1);
+ obj1 = fontDict->lookup("Widths");
if (obj1.isArray()) {
flags |= fontFixedWidth;
if (obj1.arrayGetLength() < lastChar - firstChar + 1) {
lastChar = firstChar + obj1.arrayGetLength() - 1;
}
for (code = firstChar; code <= lastChar; ++code) {
- obj1.arrayGet(code - firstChar, &obj2);
+ Object obj2 = obj1.arrayGet(code - firstChar);
if (obj2.isNum()) {
widths[code] = obj2.getNum() * mul;
if (fabs(widths[code] - widths[firstChar]) > 0.00001) {
flags &= ~fontFixedWidth;
}
}
- obj2.free();
}
// use widths from built-in font
@@ -1523,7 +1474,6 @@
}
}
}
- obj1.free();
ok = gTrue;
}
@@ -1537,12 +1487,6 @@
}
}
ctu->decRefCnt();
- if (charProcs.isDict()) {
- charProcs.free();
- }
- if (resources.isDict()) {
- resources.free();
- }
}
// This function is in part a derived work of the Adobe Glyph Mapping
@@ -1809,13 +1753,12 @@
return charProcs.isDict() ? charProcs.getDict() : (Dict *)NULL;
}
-Object *Gfx8BitFont::getCharProc(int code, Object *proc) {
+Object Gfx8BitFont::getCharProc(int code) {
if (enc[code] && charProcs.isDict()) {
- charProcs.dictLookup(enc[code], proc);
+ return charProcs.dictLookup(enc[code]);
} else {
- proc->initNull();
+ return Object(objNull);
}
- return proc;
}
Dict *Gfx8BitFont::getResources() {
@@ -1872,17 +1815,16 @@
cidToGIDLen = 0;
// get the descendant font
- if (!fontDict->lookup("DescendantFonts", &obj1)->isArray() ||
- obj1.arrayGetLength() == 0) {
+ obj1 = fontDict->lookup("DescendantFonts");
+ if (!obj1.isArray() || obj1.arrayGetLength() == 0) {
error(errSyntaxError, -1, "Missing or empty DescendantFonts entry in Type 0 font");
- obj1.free();
- goto err1;
+ return;
}
- if (!obj1.arrayGet(0, &desFontDictObj)->isDict()) {
+ desFontDictObj = obj1.arrayGet(0);
+ if (!desFontDictObj.isDict()) {
error(errSyntaxError, -1, "Bad descendant font in Type 0 font");
- goto err3;
+ return;
}
- obj1.free();
desFontDict = desFontDictObj.getDict();
// get info from font descriptor
@@ -1891,20 +1833,18 @@
//----- encoding info -----
// char collection
- if (!desFontDict->lookup("CIDSystemInfo", &obj1)->isDict()) {
+ obj1 = desFontDict->lookup("CIDSystemInfo");
+ if (!obj1.isDict()) {
error(errSyntaxError, -1, "Missing CIDSystemInfo dictionary in Type 0 descendant font");
- goto err3;
+ return;
}
- obj1.dictLookup("Registry", &obj2);
- obj1.dictLookup("Ordering", &obj3);
+ obj2 = obj1.dictLookup("Registry");
+ obj3 = obj1.dictLookup("Ordering");
if (!obj2.isString() || !obj3.isString()) {
error(errSyntaxError, -1, "Invalid CIDSystemInfo dictionary in Type 0 descendant font");
- goto err3;
+ return;
}
collection = obj2.getString()->copy()->append('-')->append(obj3.getString());
- obj3.free();
- obj2.free();
- obj1.free();
// look for a ToUnicode CMap
if (!(ctu = readToUnicodeCMap(fontDict, 16, NULL))) {
@@ -1933,7 +1873,7 @@
for (size_t i = 0; i < sizeof(knownCollections)/sizeof(knownCollections[0]); i++) {
if (collection->cmp(knownCollections[i]) == 0) {
error(errSyntaxError, -1, "Missing language pack for '{0:t}' mapping", collection);
- goto err2;
+ return;
}
}
error(errSyntaxError, -1, "Unknown character collection '{0:t}'",
@@ -1963,14 +1903,14 @@
}
// encoding (i.e., CMap)
- if (fontDict->lookup("Encoding", &obj1)->isNull()) {
+ obj1 = fontDict->lookup("Encoding");
+ if (obj1.isNull()) {
error(errSyntaxError, -1, "Missing Encoding entry in Type 0 font");
- goto err2;
+ return;
}
if (!(cMap = CMap::parse(NULL, collection, &obj1))) {
- goto err2;
+ return;
}
- obj1.free();
if (cMap->getCMapName()) {
encodingName->Set(cMap->getCMapName()->getCString());
} else {
@@ -1979,7 +1919,7 @@
// CIDToGIDMap (for embedded TrueType fonts)
if (type == fontCIDType2 || type == fontCIDType2OT) {
- desFontDict->lookup("CIDToGIDMap", &obj1);
+ obj1 = desFontDict->lookup("CIDToGIDMap");
if (obj1.isStream()) {
cidToGIDLen = 0;
i = 64;
@@ -1996,26 +1936,27 @@
} else if (!obj1.isName("Identity") && !obj1.isNull()) {
error(errSyntaxError, -1, "Invalid CIDToGIDMap entry in CID font");
}
- obj1.free();
}
//----- character metrics -----
// default char width
- if (desFontDict->lookup("DW", &obj1)->isInt()) {
+ obj1 = desFontDict->lookup("DW");
+ if (obj1.isInt()) {
widths.defWidth = obj1.getInt() * 0.001;
}
- obj1.free();
// char width exceptions
- if (desFontDict->lookup("W", &obj1)->isArray()) {
+ obj1 = desFontDict->lookup("W");
+ if (obj1.isArray()) {
excepsSize = 0;
i = 0;
while (i + 1 < obj1.arrayGetLength()) {
- obj1.arrayGet(i, &obj2);
- obj1.arrayGet(i + 1, &obj3);
+ obj2 = obj1.arrayGet(i);
+ obj3 = obj1.arrayGet(i + 1);
if (obj2.isInt() && obj3.isInt() && i + 2 < obj1.arrayGetLength()) {
- if (obj1.arrayGet(i + 2, &obj4)->isNum()) {
+ obj4 = obj1.arrayGet(i + 2);
+ if (obj4.isNum()) {
if (widths.nExceps == excepsSize) {
excepsSize += 16;
widths.exceps = (GfxFontCIDWidthExcep *)
@@ -2029,7 +1970,6 @@
} else {
error(errSyntaxError, -1, "Bad widths array in Type 0 font");
}
- obj4.free();
i += 3;
} else if (obj2.isInt() && obj3.isArray()) {
if (widths.nExceps + obj3.arrayGetLength() > excepsSize) {
@@ -2040,7 +1980,8 @@
}
j = obj2.getInt();
for (k = 0; k < obj3.arrayGetLength(); ++k) {
- if (obj3.arrayGet(k, &obj4)->isNum()) {
+ obj4 = obj3.arrayGet(k);
+ if (obj4.isNum()) {
widths.exceps[widths.nExceps].first = j;
widths.exceps[widths.nExceps].last = j;
widths.exceps[widths.nExceps].width = obj4.getNum() * 0.001;
@@ -2049,46 +1990,43 @@
} else {
error(errSyntaxError, -1, "Bad widths array in Type 0 font");
}
- obj4.free();
}
i += 2;
} else {
error(errSyntaxError, -1, "Bad widths array in Type 0 font");
++i;
}
- obj3.free();
- obj2.free();
}
std::sort(widths.exceps, widths.exceps + widths.nExceps,
cmpWidthExcepFunctor());
}
- obj1.free();
// default metrics for vertical font
- if (desFontDict->lookup("DW2", &obj1)->isArray() &&
+ obj1 = desFontDict->lookup("DW2");
+ if (obj1.isArray() &&
obj1.arrayGetLength() == 2) {
- if (obj1.arrayGet(0, &obj2)->isNum()) {
+ obj2 = obj1.arrayGet(0);
+ if (obj2.isNum()) {
widths.defVY = obj2.getNum() * 0.001;
}
- obj2.free();
- if (obj1.arrayGet(1, &obj2)->isNum()) {
+ obj2 = obj1.arrayGet(1);
+ if (obj2.isNum()) {
widths.defHeight = obj2.getNum() * 0.001;
}
- obj2.free();
}
- obj1.free();
// char metric exceptions for vertical font
- if (desFontDict->lookup("W2", &obj1)->isArray()) {
+ obj1 = desFontDict->lookup("W2");
+ if (obj1.isArray()) {
excepsSize = 0;
i = 0;
while (i + 1 < obj1.arrayGetLength()) {
- obj1.arrayGet(i, &obj2);
- obj1.arrayGet(i+ 1, &obj3);
+ obj2 = obj1.arrayGet(i);
+ obj3 = obj1.arrayGet(i+ 1);
if (obj2.isInt() && obj3.isInt() && i + 4 < obj1.arrayGetLength()) {
- if (obj1.arrayGet(i + 2, &obj4)->isNum() &&
- obj1.arrayGet(i + 3, &obj5)->isNum() &&
- obj1.arrayGet(i + 4, &obj6)->isNum()) {
+ if ((obj4 = obj1.arrayGet(i + 2), obj4.isNum()) &&
+ (obj5 = obj1.arrayGet(i + 3), obj5.isNum()) &&
+ (obj6 = obj1.arrayGet(i + 4), obj6.isNum())) {
if (widths.nExcepsV == excepsSize) {
excepsSize += 16;
widths.excepsV = (GfxFontCIDWidthExcepV *)
@@ -2104,9 +2042,6 @@
} else {
error(errSyntaxError, -1, "Bad widths (W2) array in Type 0 font");
}
- obj6.free();
- obj5.free();
- obj4.free();
i += 5;
} else if (obj2.isInt() && obj3.isArray()) {
if (widths.nExcepsV + obj3.arrayGetLength() / 3 > excepsSize) {
@@ -2118,9 +2053,9 @@
}
j = obj2.getInt();
for (k = 0; k < obj3.arrayGetLength(); k += 3) {
- if (obj3.arrayGet(k, &obj4)->isNum() &&
- obj3.arrayGet(k+1, &obj5)->isNum() &&
- obj3.arrayGet(k+2, &obj6)->isNum()) {
+ if ((obj4 = obj3.arrayGet(k), obj4.isNum()) &&
+ (obj5 = obj3.arrayGet(k+1), obj5.isNum()) &&
+ (obj6 = obj3.arrayGet(k+2), obj6.isNum())) {
widths.excepsV[widths.nExcepsV].first = j;
widths.excepsV[widths.nExcepsV].last = j;
widths.excepsV[widths.nExcepsV].height = obj4.getNum() * 0.001;
@@ -2131,34 +2066,18 @@
} else {
error(errSyntaxError, -1, "Bad widths (W2) array in Type 0 font");
}
- obj6.free();
- obj5.free();
- obj4.free();
}
i += 2;
} else {
error(errSyntaxError, -1, "Bad widths (W2) array in Type 0 font");
++i;
}
- obj3.free();
- obj2.free();
}
std::sort(widths.excepsV, widths.excepsV + widths.nExcepsV,
cmpWidthExcepVFunctor());
}
- obj1.free();
- desFontDictObj.free();
ok = gTrue;
- return;
-
- err3:
- obj3.free();
- obj2.free();
- err2:
- obj1.free();
- desFontDictObj.free();
- err1:;
}
GfxCIDFont::~GfxCIDFont() {
@@ -2560,14 +2479,13 @@
GfxFontDict::GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict) {
int i;
- Object obj1, obj2;
Ref r;
numFonts = fontDict->getLength();
fonts = (GfxFont **)gmallocn(numFonts, sizeof(GfxFont *));
for (i = 0; i < numFonts; ++i) {
- fontDict->getValNF(i, &obj1);
- obj1.fetch(xref, &obj2);
+ Object obj1 = fontDict->getValNF(i);
+ Object obj2 = obj1.fetch(xref);
if (obj2.isDict()) {
if (obj1.isRef()) {
r = obj1.getRef();
@@ -2596,8 +2514,6 @@
error(errSyntaxError, -1, "font resource is not a dictionary");
fonts[i] = NULL;
}
- obj1.free();
- obj2.free();
}
}
diff --git a/poppler/GfxFont.h b/poppler/GfxFont.h
index de7a746..06c1df6 100644
--- a/poppler/GfxFont.h
+++ b/poppler/GfxFont.h
@@ -13,7 +13,7 @@
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
-// Copyright (C) 2005, 2008, 2015 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005, 2008, 2015, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de>
// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com>
// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
@@ -352,7 +352,7 @@
Dict *getCharProcs();
// Return the Type 3 CharProc for the character associated with <code>.
- Object *getCharProc(int code, Object *proc);
+ Object getCharProc(int code);
// Return the Type 3 Resources dictionary, or NULL if none.
Dict *getResources();
diff --git a/poppler/GfxState.cc b/poppler/GfxState.cc
index f61f812..b2971ec 100644
--- a/poppler/GfxState.cc
+++ b/poppler/GfxState.cc
@@ -314,40 +314,34 @@
if (csObj->isName()) {
if (csObj->isName("DeviceGray") || csObj->isName("G")) {
if (res != NULL) {
- Object objCS;
- res->lookupColorSpace("DefaultGray", &objCS);
+ Object objCS = res->lookupColorSpace("DefaultGray");
if (objCS.isNull()) {
cs = new GfxDeviceGrayColorSpace();
} else {
cs = GfxColorSpace::parse(NULL, &objCS, out, state);
}
- objCS.free();
} else {
cs = new GfxDeviceGrayColorSpace();
}
} else if (csObj->isName("DeviceRGB") || csObj->isName("RGB")) {
if (res != NULL) {
- Object objCS;
- res->lookupColorSpace("DefaultRGB", &objCS);
+ Object objCS = res->lookupColorSpace("DefaultRGB");
if (objCS.isNull()) {
cs = new GfxDeviceRGBColorSpace();
} else {
cs = GfxColorSpace::parse(NULL, &objCS, out, state);
}
- objCS.free();
} else {
cs = new GfxDeviceRGBColorSpace();
}
} else if (csObj->isName("DeviceCMYK") || csObj->isName("CMYK")) {
if (res != NULL) {
- Object objCS;
- res->lookupColorSpace("DefaultCMYK", &objCS);
+ Object objCS = res->lookupColorSpace("DefaultCMYK");
if (objCS.isNull()) {
cs = new GfxDeviceCMYKColorSpace();
} else {
cs = GfxColorSpace::parse(NULL, &objCS, out, state);
}
- objCS.free();
} else {
cs = new GfxDeviceCMYKColorSpace();
}
@@ -357,43 +351,37 @@
error(errSyntaxWarning, -1, "Bad color space '{0:s}'", csObj->getName());
}
} else if (csObj->isArray() && csObj->arrayGetLength() > 0) {
- csObj->arrayGet(0, &obj1);
+ obj1 = csObj->arrayGet(0);
if (obj1.isName("DeviceGray") || obj1.isName("G")) {
if (res != NULL) {
- Object objCS;
- res->lookupColorSpace("DefaultGray", &objCS);
+ Object objCS = res->lookupColorSpace("DefaultGray");
if (objCS.isNull()) {
cs = new GfxDeviceGrayColorSpace();
} else {
cs = GfxColorSpace::parse(NULL, &objCS, out, state);
}
- objCS.free();
} else {
cs = new GfxDeviceGrayColorSpace();
}
} else if (obj1.isName("DeviceRGB") || obj1.isName("RGB")) {
if (res != NULL) {
- Object objCS;
- res->lookupColorSpace("DefaultRGB", &objCS);
+ Object objCS = res->lookupColorSpace("DefaultRGB");
if (objCS.isNull()) {
cs = new GfxDeviceRGBColorSpace();
} else {
cs = GfxColorSpace::parse(NULL, &objCS, out, state);
}
- objCS.free();
} else {
cs = new GfxDeviceRGBColorSpace();
}
} else if (obj1.isName("DeviceCMYK") || obj1.isName("CMYK")) {
if (res != NULL) {
- Object objCS;
- res->lookupColorSpace("DefaultCMYK", &objCS);
+ Object objCS = res->lookupColorSpace("DefaultCMYK");
if (objCS.isNull()) {
cs = new GfxDeviceCMYKColorSpace();
} else {
cs = GfxColorSpace::parse(NULL, &objCS, out, state);
}
- objCS.free();
} else {
cs = new GfxDeviceCMYKColorSpace();
}
@@ -416,52 +404,44 @@
} else {
error(errSyntaxWarning, -1, "Bad color space");
}
- obj1.free();
} else if (csObj->isDict()) {
- csObj->dictLookup("ColorSpace", &obj1);
+ obj1 = csObj->dictLookup("ColorSpace");
if (obj1.isName("DeviceGray")) {
if (res != NULL) {
- Object objCS;
- res->lookupColorSpace("DefaultGray", &objCS);
+ Object objCS = res->lookupColorSpace("DefaultGray");
if (objCS.isNull()) {
cs = new GfxDeviceGrayColorSpace();
} else {
cs = GfxColorSpace::parse(NULL, &objCS, out, state);
}
- objCS.free();
} else {
cs = new GfxDeviceGrayColorSpace();
}
} else if (obj1.isName("DeviceRGB")) {
if (res != NULL) {
- Object objCS;
- res->lookupColorSpace("DefaultRGB", &objCS);
+ Object objCS = res->lookupColorSpace("DefaultRGB");
if (objCS.isNull()) {
cs = new GfxDeviceRGBColorSpace();
} else {
cs = GfxColorSpace::parse(NULL, &objCS, out, state);
}
- objCS.free();
} else {
cs = new GfxDeviceRGBColorSpace();
}
} else if (obj1.isName("DeviceCMYK")) {
if (res != NULL) {
- Object objCS;
- res->lookupColorSpace("DefaultCMYK", &objCS);
+ Object objCS = res->lookupColorSpace("DefaultCMYK");
if (objCS.isNull()) {
cs = new GfxDeviceCMYKColorSpace();
} else {
cs = GfxColorSpace::parse(NULL, &objCS, out, state);
}
- objCS.free();
} else {
cs = new GfxDeviceCMYKColorSpace();
}
} else {
error(errSyntaxWarning, -1, "Bad color space dict'");
}
- obj1.free();
} else {
error(errSyntaxWarning, -1, "Bad color space - expected name or array or dict");
}
@@ -830,52 +810,42 @@
GfxColorSpace *GfxCalGrayColorSpace::parse(Array *arr, GfxState *state) {
GfxCalGrayColorSpace *cs;
- Object obj1, obj2, obj3;
+ Object obj1, obj2;
- arr->get(1, &obj1);
+ obj1 = arr->get(1);
if (!obj1.isDict()) {
error(errSyntaxWarning, -1, "Bad CalGray color space");
- obj1.free();
return NULL;
}
cs = new GfxCalGrayColorSpace();
- if (obj1.dictLookup("WhitePoint", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
+ obj2 = obj1.dictLookup("WhitePoint");
+ if (obj2.isArray() && obj2.arrayGetLength() == 3) {
+ Object obj3 = obj2.arrayGet(0);
if (likely(obj3.isNum()))
cs->whiteX = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
+ obj3 = obj2.arrayGet(1);
if (likely(obj3.isNum()))
cs->whiteY = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
+ obj3 = obj2.arrayGet(2);
if (likely(obj3.isNum()))
cs->whiteZ = obj3.getNum();
- obj3.free();
}
- obj2.free();
- if (obj1.dictLookup("BlackPoint", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
+ obj2 = obj1.dictLookup("BlackPoint");
+ if (obj2.isArray() && obj2.arrayGetLength() == 3) {
+ Object obj3 = obj2.arrayGet(0);
if (likely(obj3.isNum()))
cs->blackX = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
+ obj3 = obj2.arrayGet(1);
if (likely(obj3.isNum()))
cs->blackY = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
+ obj3 = obj2.arrayGet(2);
if (likely(obj3.isNum()))
cs->blackZ = obj3.getNum();
- obj3.free();
}
- obj2.free();
- if (obj1.dictLookup("Gamma", &obj2)->isNum()) {
+ obj2 = obj1.dictLookup("Gamma");
+ if (obj2.isNum()) {
cs->gamma = obj2.getNum();
}
- obj2.free();
- obj1.free();
cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX +
xyzrgb[0][1] * cs->whiteY +
@@ -1209,75 +1179,59 @@
GfxColorSpace *GfxCalRGBColorSpace::parse(Array *arr, GfxState *state) {
GfxCalRGBColorSpace *cs;
- Object obj1, obj2, obj3;
+ Object obj1, obj2;
int i;
- arr->get(1, &obj1);
+ obj1 = arr->get(1);
if (!obj1.isDict()) {
error(errSyntaxWarning, -1, "Bad CalRGB color space");
- obj1.free();
return NULL;
}
cs = new GfxCalRGBColorSpace();
- if (obj1.dictLookup("WhitePoint", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
+ obj2 = obj1.dictLookup("WhitePoint");
+ if (obj2.isArray() && obj2.arrayGetLength() == 3) {
+ Object obj3 = obj2.arrayGet(0);
if (likely(obj3.isNum()))
cs->whiteX = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
+ obj3 = obj2.arrayGet(1);
if (likely(obj3.isNum()))
cs->whiteY = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
+ obj3 = obj2.arrayGet(2);
if (likely(obj3.isNum()))
cs->whiteZ = obj3.getNum();
- obj3.free();
}
- obj2.free();
- if (obj1.dictLookup("BlackPoint", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
+ obj2 = obj1.dictLookup("BlackPoint");
+ if (obj2.isArray() && obj2.arrayGetLength() == 3) {
+ Object obj3 = obj2.arrayGet(0);
if (likely(obj3.isNum()))
cs->blackX = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
+ obj3 = obj2.arrayGet(1);
if (likely(obj3.isNum()))
cs->blackY = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
+ obj3 = obj2.arrayGet(2);
if (likely(obj3.isNum()))
cs->blackZ = obj3.getNum();
- obj3.free();
}
- obj2.free();
- if (obj1.dictLookup("Gamma", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
+ obj2 = obj1.dictLookup("Gamma");
+ if (obj2.isArray() && obj2.arrayGetLength() == 3) {
+ Object obj3 = obj2.arrayGet(0);
if (likely(obj3.isNum()))
cs->gammaR = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
+ obj3 = obj2.arrayGet(1);
if (likely(obj3.isNum()))
cs->gammaG = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
+ obj3 = obj2.arrayGet(2);
if (likely(obj3.isNum()))
cs->gammaB = obj3.getNum();
- obj3.free();
}
- obj2.free();
- if (obj1.dictLookup("Matrix", &obj2)->isArray() &&
- obj2.arrayGetLength() == 9) {
+ obj2 = obj1.dictLookup("Matrix");
+ if (obj2.isArray() && obj2.arrayGetLength() == 9) {
for (i = 0; i < 9; ++i) {
- obj2.arrayGet(i, &obj3);
+ Object obj3 = obj2.arrayGet(i);
if (likely(obj3.isNum()))
cs->mat[i] = obj3.getNum();
- obj3.free();
}
}
- obj2.free();
- obj1.free();
cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX +
xyzrgb[0][1] * cs->whiteY +
@@ -1596,58 +1550,43 @@
GfxColorSpace *GfxLabColorSpace::parse(Array *arr, GfxState *state) {
GfxLabColorSpace *cs;
- Object obj1, obj2, obj3;
+ Object obj1, obj2;
- arr->get(1, &obj1);
+ obj1 = arr->get(1);
if (!obj1.isDict()) {
error(errSyntaxWarning, -1, "Bad Lab color space");
- obj1.free();
return NULL;
}
cs = new GfxLabColorSpace();
- if (obj1.dictLookup("WhitePoint", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
+ obj2 = obj1.dictLookup("WhitePoint");
+ if (obj2.isArray() && obj2.arrayGetLength() == 3) {
+ Object obj3 = obj2.arrayGet(0);
cs->whiteX = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
+ obj3 = obj2.arrayGet(1);
cs->whiteY = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
+ obj3 = obj2.arrayGet(2);
cs->whiteZ = obj3.getNum();
- obj3.free();
}
- obj2.free();
- if (obj1.dictLookup("BlackPoint", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
+ obj2 = obj1.dictLookup("BlackPoint");
+ if (obj2.isArray() && obj2.arrayGetLength() == 3) {
+ Object obj3 = obj2.arrayGet(0);
cs->blackX = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
+ obj3 = obj2.arrayGet(1);
cs->blackY = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
+ obj3 = obj2.arrayGet(2);
cs->blackZ = obj3.getNum();
- obj3.free();
}
- obj2.free();
- if (obj1.dictLookup("Range", &obj2)->isArray() &&
- obj2.arrayGetLength() == 4) {
- obj2.arrayGet(0, &obj3);
+ obj2 = obj1.dictLookup("Range");
+ if (obj2.isArray() && obj2.arrayGetLength() == 4) {
+ Object obj3 = obj2.arrayGet(0);
cs->aMin = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
+ obj3 = obj2.arrayGet(1);
cs->aMax = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
+ obj3 = obj2.arrayGet(2);
cs->bMin = obj3.getNum();
- obj3.free();
- obj2.arrayGet(3, &obj3);
+ obj3 = obj2.arrayGet(3);
cs->bMax = obj3.getNum();
- obj3.free();
}
- obj2.free();
- obj1.free();
cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX +
xyzrgb[0][1] * cs->whiteY +
@@ -1936,14 +1875,13 @@
error(errSyntaxError, -1, "Bad ICCBased color space");
return NULL;
}
- arr->getNF(1, &obj1);
+ obj1 = arr->getNF(1);
if (obj1.isRef()) {
iccProfileStreamA = obj1.getRef();
} else {
iccProfileStreamA.num = 0;
iccProfileStreamA.gen = 0;
}
- obj1.free();
#ifdef USE_CMS
// check cache
if (out && iccProfileStreamA.num > 0) {
@@ -1973,28 +1911,26 @@
}
}
#endif
- arr->get(1, &obj1);
+ obj1 = arr->get(1);
if (!obj1.isStream()) {
error(errSyntaxWarning, -1, "Bad ICCBased color space (stream)");
- obj1.free();
return NULL;
}
dict = obj1.streamGetDict();
- if (!dict->lookup("N", &obj2)->isInt()) {
+ obj2 = dict->lookup("N");
+ if (!obj2.isInt()) {
error(errSyntaxWarning, -1, "Bad ICCBased color space (N)");
- obj2.free();
- obj1.free();
- return NULL;
+ return nullptr;
}
nCompsA = obj2.getInt();
- obj2.free();
if (nCompsA > 4) {
error(errSyntaxError, -1,
"ICCBased color space with too many ({0:d} > 4) components",
nCompsA);
nCompsA = 4;
}
- if (dict->lookup("Alternate", &obj2)->isNull() ||
+ obj2 = dict->lookup("Alternate");
+ if (obj2.isNull() ||
!(altA = GfxColorSpace::parse(NULL, &obj2, out, state, recursion + 1))) {
switch (nCompsA) {
case 1:
@@ -2008,38 +1944,30 @@
break;
default:
error(errSyntaxWarning, -1, "Bad ICCBased color space - invalid N");
- obj2.free();
- obj1.free();
return NULL;
}
}
- obj2.free();
if (altA->getNComps() != nCompsA) {
error(errSyntaxWarning, -1, "Bad ICCBased color space - N doesn't match alt color space");
delete altA;
- obj1.free();
return NULL;
}
cs = new GfxICCBasedColorSpace(nCompsA, altA, &iccProfileStreamA);
- if (dict->lookup("Range", &obj2)->isArray() &&
- obj2.arrayGetLength() == 2 * nCompsA) {
+ obj2 = dict->lookup("Range");
+ if (obj2.isArray() && obj2.arrayGetLength() == 2 * nCompsA) {
Object obj4;
for (i = 0; i < nCompsA; ++i) {
- obj2.arrayGet(2*i, &obj3);
- obj2.arrayGet(2*i+1, &obj4);
+ obj3 = obj2.arrayGet(2*i);
+ obj4 = obj2.arrayGet(2*i+1);
if (obj3.isNum() && obj4.isNum()) {
cs->rangeMin[i] = obj3.getNum();
cs->rangeMax[i] = obj4.getNum();
}
- obj3.free();
- obj4.free();
}
}
- obj2.free();
- obj1.free();
#ifdef USE_CMS
- arr->get(1, &obj1);
+ obj1 = arr->get(1);
Guchar *profBuf;
Stream *iccStream = obj1.getStream();
int length = 0;
@@ -2099,7 +2027,6 @@
}
cmsCloseProfile(hp);
}
- obj1.free();
// put this colorSpace into cache
if (out && iccProfileStreamA.num > 0) {
GfxICCBasedColorSpaceKey *k = new GfxICCBasedColorSpaceKey(iccProfileStreamA.num, iccProfileStreamA.gen);
@@ -2581,27 +2508,26 @@
}
GfxColorSpace *GfxIndexedColorSpace::parse(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, int recursion) {
- GfxIndexedColorSpace *cs;
GfxColorSpace *baseA;
int indexHighA;
Object obj1;
char *s;
- int n, i, j;
+ int i, j;
if (arr->getLength() != 4) {
error(errSyntaxWarning, -1, "Bad Indexed color space");
- goto err1;
+ return nullptr;
}
- arr->get(1, &obj1);
+ obj1 = arr->get(1);
if (!(baseA = GfxColorSpace::parse(res, &obj1, out, state, recursion + 1))) {
error(errSyntaxWarning, -1, "Bad Indexed color space (base color space)");
- goto err2;
+ return nullptr;
}
- obj1.free();
- if (!arr->get(2, &obj1)->isInt()) {
+ obj1 = arr->get(2);
+ if (!obj1.isInt()) {
error(errSyntaxWarning, -1, "Bad Indexed color space (hival)");
delete baseA;
- goto err2;
+ return nullptr;
}
indexHighA = obj1.getInt();
if (indexHighA < 0 || indexHighA > 255) {
@@ -2614,10 +2540,9 @@
else indexHighA = 255;
error(errSyntaxWarning, -1, "Bad Indexed color space (invalid indexHigh value, was {0:d} using {1:d} to try to recover)", previousValue, indexHighA);
}
- obj1.free();
- cs = new GfxIndexedColorSpace(baseA, indexHighA);
- arr->get(3, &obj1);
- n = baseA->getNComps();
+ GfxIndexedColorSpace *cs = new GfxIndexedColorSpace(baseA, indexHighA);
+ obj1 = arr->get(3);
+ const int n = baseA->getNComps();
if (obj1.isStream()) {
obj1.streamReset();
for (i = 0; i <= indexHighA; ++i) {
@@ -2643,15 +2568,11 @@
error(errSyntaxWarning, -1, "Bad Indexed color space (lookup table)");
goto err3;
}
- obj1.free();
return cs;
err3:
delete cs;
- err2:
- obj1.free();
- err1:
- return NULL;
+ return nullptr;
}
GfxColor *GfxIndexedColorSpace::mapColorToBase(GfxColor *color,
@@ -2856,19 +2777,18 @@
error(errSyntaxWarning, -1, "Bad Separation color space");
goto err1;
}
- if (!arr->get(1, &obj1)->isName()) {
+ obj1 = arr->get(1);
+ if (!obj1.isName()) {
error(errSyntaxWarning, -1, "Bad Separation color space (name)");
- goto err2;
+ goto err1;
}
nameA = new GooString(obj1.getName());
- obj1.free();
- arr->get(2, &obj1);
+ obj1 = arr->get(2);
if (!(altA = GfxColorSpace::parse(res, &obj1, out, state, recursion + 1))) {
error(errSyntaxWarning, -1, "Bad Separation color space (alternate color space)");
goto err3;
}
- obj1.free();
- arr->get(3, &obj1);
+ obj1 = arr->get(3);
if (!(funcA = Function::parse(&obj1))) {
goto err4;
}
@@ -2876,7 +2796,6 @@
error(errSyntaxWarning, -1, "Bad SeparationColorSpace function");
goto err5;
}
- obj1.free();
cs = new GfxSeparationColorSpace(nameA, altA, funcA);
return cs;
@@ -2886,10 +2805,8 @@
delete altA;
err3:
delete nameA;
- err2:
- obj1.free();
err1:
- return NULL;
+ return nullptr;
}
void GfxSeparationColorSpace::getGray(GfxColor *color, GfxGray *gray) {
@@ -3131,12 +3048,11 @@
//~ handle the 'None' colorant
GfxColorSpace *GfxDeviceNColorSpace::parse(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, int recursion) {
- GfxDeviceNColorSpace *cs;
int nCompsA;
GooString *namesA[gfxColorMaxComps];
GfxColorSpace *altA;
Function *funcA;
- Object obj1, obj2;
+ Object obj1;
int i;
GooList *separationList = new GooList();
@@ -3144,9 +3060,10 @@
error(errSyntaxWarning, -1, "Bad DeviceN color space");
goto err1;
}
- if (!arr->get(1, &obj1)->isArray()) {
+ obj1 = arr->get(1);
+ if (!obj1.isArray()) {
error(errSyntaxWarning, -1, "Bad DeviceN color space (names)");
- goto err2;
+ goto err1;
}
nCompsA = obj1.arrayGetLength();
if (nCompsA > gfxColorMaxComps) {
@@ -3155,63 +3072,53 @@
nCompsA = gfxColorMaxComps;
}
for (i = 0; i < nCompsA; ++i) {
- if (!obj1.arrayGet(i, &obj2)->isName()) {
+ Object obj2 = obj1.arrayGet(i);
+ if (!obj2.isName()) {
error(errSyntaxWarning, -1, "Bad DeviceN color space (names)");
- obj2.free();
- goto err2;
+ goto err1;
}
namesA[i] = new GooString(obj2.getName());
- obj2.free();
}
- obj1.free();
- arr->get(2, &obj1);
+ obj1 = arr->get(2);
if (!(altA = GfxColorSpace::parse(res, &obj1, out, state, recursion + 1))) {
error(errSyntaxWarning, -1, "Bad DeviceN color space (alternate color space)");
goto err3;
}
- obj1.free();
- arr->get(3, &obj1);
+ obj1 = arr->get(3);
if (!(funcA = Function::parse(&obj1))) {
goto err4;
}
- obj1.free();
if (arr->getLength() == 5) {
- if (!arr->get(4, &obj1)->isDict()) {
+ obj1 = arr->get(4);
+ if (!obj1.isDict()) {
error(errSyntaxWarning, -1, "Bad DeviceN color space (attributes)");
- goto err4;
+ goto err5;
}
Dict *attribs = obj1.getDict();
- attribs->lookup("Colorants", &obj2);
+ Object obj2 = attribs->lookup("Colorants");
if (obj2.isDict()) {
Dict *colorants = obj2.getDict();
for (i = 0; i < colorants->getLength(); i++) {
- Object obj3;
- colorants->getVal(i, &obj3);
+ Object obj3 = colorants->getVal(i);
if (obj3.isArray()) {
separationList->append(GfxSeparationColorSpace::parse(res, obj3.getArray(), out, state, recursion));
} else {
- obj3.free();
- obj2.free();
error(errSyntaxWarning, -1, "Bad DeviceN color space (colorant value entry is not an Array)");
- goto err4;
+ goto err5;
}
- obj3.free();
}
}
- obj2.free();
- obj1.free();
}
- cs = new GfxDeviceNColorSpace(nCompsA, namesA, altA, funcA, separationList);
- return cs;
+ return new GfxDeviceNColorSpace(nCompsA, namesA, altA, funcA, separationList);
+ err5:
+ delete funcA;
err4:
delete altA;
err3:
for (i = 0; i < nCompsA; ++i) {
delete namesA[i];
}
- err2:
- obj1.free();
err1:
delete separationList;
return NULL;
@@ -3407,13 +3314,11 @@
}
underA = NULL;
if (arr->getLength() == 2) {
- arr->get(1, &obj1);
+ obj1 = arr->get(1);
if (!(underA = GfxColorSpace::parse(res, &obj1, out, state, recursion + 1))) {
error(errSyntaxWarning, -1, "Bad Pattern color space (underlying color space)");
- obj1.free();
return NULL;
}
- obj1.free();
}
cs = new GfxPatternColorSpace(underA);
return cs;
@@ -3458,11 +3363,11 @@
Object obj1;
if (obj->isDict()) {
- obj->dictLookup("PatternType", &obj1);
+ obj1 = obj->dictLookup("PatternType");
} else if (obj->isStream()) {
- obj->streamGetDict()->lookup("PatternType", &obj1);
+ obj1 = obj->streamGetDict()->lookup("PatternType");
} else {
- return NULL;
+ return nullptr;
}
pattern = NULL;
if (obj1.isInt() && obj1.getInt() == 1) {
@@ -3470,7 +3375,6 @@
} else if (obj1.isInt() && obj1.getInt() == 2) {
pattern = GfxShadingPattern::parse(res, obj, out, state);
}
- obj1.free();
return pattern;
}
@@ -3479,13 +3383,12 @@
//------------------------------------------------------------------------
GfxTilingPattern *GfxTilingPattern::parse(Object *patObj) {
- GfxTilingPattern *pat;
Dict *dict;
int paintTypeA, tilingTypeA;
double bboxA[4], matrixA[6];
double xStepA, yStepA;
Object resDictA;
- Object obj1, obj2;
+ Object obj1;
int i;
if (!patObj->isStream()) {
@@ -3493,71 +3396,66 @@
}
dict = patObj->streamGetDict();
- if (dict->lookup("PaintType", &obj1)->isInt()) {
+ obj1 = dict->lookup("PaintType");
+ if (obj1.isInt()) {
paintTypeA = obj1.getInt();
} else {
paintTypeA = 1;
error(errSyntaxWarning, -1, "Invalid or missing PaintType in pattern");
}
- obj1.free();
- if (dict->lookup("TilingType", &obj1)->isInt()) {
+ obj1 = dict->lookup("TilingType");
+ if (obj1.isInt()) {
tilingTypeA = obj1.getInt();
} else {
tilingTypeA = 1;
error(errSyntaxWarning, -1, "Invalid or missing TilingType in pattern");
}
- obj1.free();
bboxA[0] = bboxA[1] = 0;
bboxA[2] = bboxA[3] = 1;
- if (dict->lookup("BBox", &obj1)->isArray() &&
- obj1.arrayGetLength() == 4) {
+ obj1 = dict->lookup("BBox");
+ if (obj1.isArray() && obj1.arrayGetLength() == 4) {
for (i = 0; i < 4; ++i) {
- if (obj1.arrayGet(i, &obj2)->isNum()) {
+ Object obj2 = obj1.arrayGet(i);
+ if (obj2.isNum()) {
bboxA[i] = obj2.getNum();
}
- obj2.free();
}
} else {
error(errSyntaxWarning, -1, "Invalid or missing BBox in pattern");
}
- obj1.free();
- if (dict->lookup("XStep", &obj1)->isNum()) {
+ obj1 = dict->lookup("XStep");
+ if (obj1.isNum()) {
xStepA = obj1.getNum();
} else {
xStepA = 1;
error(errSyntaxWarning, -1, "Invalid or missing XStep in pattern");
}
- obj1.free();
- if (dict->lookup("YStep", &obj1)->isNum()) {
+ obj1 = dict->lookup("YStep");
+ if (obj1.isNum()) {
yStepA = obj1.getNum();
} else {
yStepA = 1;
error(errSyntaxWarning, -1, "Invalid or missing YStep in pattern");
}
- obj1.free();
- if (!dict->lookup("Resources", &resDictA)->isDict()) {
- resDictA.free();
- resDictA.initNull();
+ resDictA = dict->lookup("Resources");
+ if (!resDictA.isDict()) {
error(errSyntaxWarning, -1, "Invalid or missing Resources in pattern");
}
matrixA[0] = 1; matrixA[1] = 0;
matrixA[2] = 0; matrixA[3] = 1;
matrixA[4] = 0; matrixA[5] = 0;
- if (dict->lookup("Matrix", &obj1)->isArray() &&
- obj1.arrayGetLength() == 6) {
+ obj1 = dict->lookup("Matrix");
+ if (obj1.isArray() && obj1.arrayGetLength() == 6) {
for (i = 0; i < 6; ++i) {
- if (obj1.arrayGet(i, &obj2)->isNum()) {
+ Object obj2 = obj1.arrayGet(i);
+ if (obj2.isNum()) {
matrixA[i] = obj2.getNum();
}
- obj2.free();
}
}
- obj1.free();
- pat = new GfxTilingPattern(paintTypeA, tilingTypeA, bboxA, xStepA, yStepA,
+ return new GfxTilingPattern(paintTypeA, tilingTypeA, bboxA, xStepA, yStepA,
&resDictA, matrixA, patObj);
- resDictA.free();
- return pat;
}
GfxTilingPattern::GfxTilingPattern(int paintTypeA, int tilingTypeA,
@@ -3575,16 +3473,14 @@
}
xStep = xStepA;
yStep = yStepA;
- resDictA->copy(&resDict);
+ resDict = resDictA->copy();
for (i = 0; i < 6; ++i) {
matrix[i] = matrixA[i];
}
- contentStreamA->copy(&contentStream);
+ contentStream = contentStreamA->copy();
}
GfxTilingPattern::~GfxTilingPattern() {
- resDict.free();
- contentStream.free();
}
GfxPattern *GfxTilingPattern::copy() {
@@ -3600,7 +3496,7 @@
Dict *dict;
GfxShading *shadingA;
double matrixA[6];
- Object obj1, obj2;
+ Object obj1;
int i;
if (!patObj->isDict()) {
@@ -3608,9 +3504,8 @@
}
dict = patObj->getDict();
- dict->lookup("Shading", &obj1);
+ obj1 = dict->lookup("Shading");
shadingA = GfxShading::parse(res, &obj1, out, state);
- obj1.free();
if (!shadingA) {
return NULL;
}
@@ -3618,16 +3513,15 @@
matrixA[0] = 1; matrixA[1] = 0;
matrixA[2] = 0; matrixA[3] = 1;
matrixA[4] = 0; matrixA[5] = 0;
- if (dict->lookup("Matrix", &obj1)->isArray() &&
- obj1.arrayGetLength() == 6) {
+ obj1 = dict->lookup("Matrix");
+ if (obj1.isArray() && obj1.arrayGetLength() == 6) {
for (i = 0; i < 6; ++i) {
- if (obj1.arrayGet(i, &obj2)->isNum()) {
+ Object obj2 = obj1.arrayGet(i);
+ if (obj2.isNum()) {
matrixA[i] = obj2.getNum();
}
- obj2.free();
}
}
- obj1.free();
return new GfxShadingPattern(shadingA, matrixA);
}
@@ -3696,13 +3590,12 @@
return NULL;
}
- if (!dict->lookup("ShadingType", &obj1)->isInt()) {
+ obj1 = dict->lookup("ShadingType");
+ if (!obj1.isInt()) {
error(errSyntaxWarning, -1, "Invalid ShadingType in shading dictionary");
- obj1.free();
return NULL;
}
typeA = obj1.getInt();
- obj1.free();
switch (typeA) {
case 1:
@@ -3758,43 +3651,41 @@
}
GBool GfxShading::init(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state) {
- Object obj1, obj2;
+ Object obj1;
int i;
- dict->lookup("ColorSpace", &obj1);
+ obj1 = dict->lookup("ColorSpace");
if (!(colorSpace = GfxColorSpace::parse(res, &obj1, out, state))) {
error(errSyntaxWarning, -1, "Bad color space in shading dictionary");
- obj1.free();
return gFalse;
}
- obj1.free();
for (i = 0; i < gfxColorMaxComps; ++i) {
background.c[i] = 0;
}
hasBackground = gFalse;
- if (dict->lookup("Background", &obj1)->isArray()) {
+ obj1 = dict->lookup("Background");
+ if (obj1.isArray()) {
if (obj1.arrayGetLength() == colorSpace->getNComps()) {
hasBackground = gTrue;
for (i = 0; i < colorSpace->getNComps(); ++i) {
- background.c[i] = dblToCol(obj1.arrayGet(i, &obj2)->getNum());
- obj2.free();
+ Object obj2 = obj1.arrayGet(i);
+ background.c[i] = dblToCol(obj2.getNum());
}
} else {
error(errSyntaxWarning, -1, "Bad Background in shading dictionary");
}
}
- obj1.free();
xMin = yMin = xMax = yMax = 0;
hasBBox = gFalse;
- if (dict->lookup("BBox", &obj1)->isArray()) {
+ obj1 = dict->lookup("BBox");
+ if (obj1.isArray()) {
if (obj1.arrayGetLength() == 4) {
- Object obj3, obj4, obj5;
- obj1.arrayGet(0, &obj2);
- obj1.arrayGet(1, &obj3);
- obj1.arrayGet(2, &obj4);
- obj1.arrayGet(3, &obj5);
+ Object obj2 = obj1.arrayGet(0);
+ Object obj3 = obj1.arrayGet(1);
+ Object obj4 = obj1.arrayGet(2);
+ Object obj5 = obj1.arrayGet(3);
if (obj2.isNum() && obj3.isNum() && obj4.isNum() && obj5.isNum())
{
hasBBox = gTrue;
@@ -3805,15 +3696,10 @@
} else {
error(errSyntaxWarning, -1, "Bad BBox in shading dictionary (Values not numbers)");
}
- obj2.free();
- obj3.free();
- obj4.free();
- obj5.free();
} else {
error(errSyntaxWarning, -1, "Bad BBox in shading dictionary");
}
}
- obj1.free();
return gTrue;
}
@@ -3875,65 +3761,53 @@
double matrixA[6];
Function *funcsA[gfxColorMaxComps];
int nFuncsA;
- Object obj1, obj2;
+ Object obj1;
int i;
x0A = y0A = 0;
x1A = y1A = 1;
- if (dict->lookup("Domain", &obj1)->isArray() &&
- obj1.arrayGetLength() == 4) {
- x0A = obj1.arrayGet(0, &obj2)->getNum();
- obj2.free();
- x1A = obj1.arrayGet(1, &obj2)->getNum();
- obj2.free();
- y0A = obj1.arrayGet(2, &obj2)->getNum();
- obj2.free();
- y1A = obj1.arrayGet(3, &obj2)->getNum();
- obj2.free();
+ obj1 = dict->lookup("Domain");
+ if (obj1.isArray() && obj1.arrayGetLength() == 4) {
+ Object obj2;
+ x0A = (obj2 = obj1.arrayGet(0), obj2.getNum());
+ x1A = (obj2 = obj1.arrayGet(1), obj2.getNum());
+ y0A = (obj2 = obj1.arrayGet(2), obj2.getNum());
+ y1A = (obj2 = obj1.arrayGet(3), obj2.getNum());
}
- obj1.free();
matrixA[0] = 1; matrixA[1] = 0;
matrixA[2] = 0; matrixA[3] = 1;
matrixA[4] = 0; matrixA[5] = 0;
- if (dict->lookup("Matrix", &obj1)->isArray() &&
- obj1.arrayGetLength() == 6) {
- matrixA[0] = obj1.arrayGet(0, &obj2)->getNum();
- obj2.free();
- matrixA[1] = obj1.arrayGet(1, &obj2)->getNum();
- obj2.free();
- matrixA[2] = obj1.arrayGet(2, &obj2)->getNum();
- obj2.free();
- matrixA[3] = obj1.arrayGet(3, &obj2)->getNum();
- obj2.free();
- matrixA[4] = obj1.arrayGet(4, &obj2)->getNum();
- obj2.free();
- matrixA[5] = obj1.arrayGet(5, &obj2)->getNum();
- obj2.free();
+ obj1 = dict->lookup("Matrix");
+ if (obj1.isArray() && obj1.arrayGetLength() == 6) {
+ Object obj2;
+ matrixA[0] = (obj2 = obj1.arrayGet(0), obj2.getNum());
+ matrixA[1] = (obj2 = obj1.arrayGet(1), obj2.getNum());
+ matrixA[2] = (obj2 = obj1.arrayGet(2), obj2.getNum());
+ matrixA[3] = (obj2 = obj1.arrayGet(3), obj2.getNum());
+ matrixA[4] = (obj2 = obj1.arrayGet(4), obj2.getNum());
+ matrixA[5] = (obj2 = obj1.arrayGet(5), obj2.getNum());
}
- obj1.free();
- dict->lookup("Function", &obj1);
+ obj1 = dict->lookup("Function");
if (obj1.isArray()) {
nFuncsA = obj1.arrayGetLength();
if (nFuncsA > gfxColorMaxComps || nFuncsA <= 0) {
error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary");
- goto err1;
+ return nullptr;
}
for (i = 0; i < nFuncsA; ++i) {
- obj1.arrayGet(i, &obj2);
+ Object obj2 = obj1.arrayGet(i);
if (!(funcsA[i] = Function::parse(&obj2))) {
- goto err2;
+ return nullptr;
}
- obj2.free();
}
} else {
nFuncsA = 1;
if (!(funcsA[0] = Function::parse(&obj1))) {
- goto err1;
+ return nullptr;
}
}
- obj1.free();
shading = new GfxFunctionShading(x0A, y0A, x1A, y1A, matrixA,
funcsA, nFuncsA);
@@ -3942,12 +3816,6 @@
return NULL;
}
return shading;
-
- err2:
- obj2.free();
- err1:
- obj1.free();
- return NULL;
}
GfxShading *GfxFunctionShading::copy() {
@@ -4204,104 +4072,83 @@
Function *funcsA[gfxColorMaxComps];
int nFuncsA;
GBool extend0A, extend1A;
- Object obj1, obj2;
+ Object obj1;
int i;
x0A = y0A = x1A = y1A = 0;
- if (dict->lookup("Coords", &obj1)->isArray() &&
- obj1.arrayGetLength() == 4) {
- Object obj3, obj4, obj5;
- obj1.arrayGet(0, &obj2);
- obj1.arrayGet(1, &obj3);
- obj1.arrayGet(2, &obj4);
- obj1.arrayGet(3, &obj5);
+ obj1 = dict->lookup("Coords");
+ if (obj1.isArray() && obj1.arrayGetLength() == 4) {
+ Object obj2 = obj1.arrayGet(0);
+ Object obj3 = obj1.arrayGet(1);
+ Object obj4 = obj1.arrayGet(2);
+ Object obj5 = obj1.arrayGet(3);
if (obj2.isNum() && obj3.isNum() && obj4.isNum() && obj5.isNum()) {
x0A = obj2.getNum();
y0A = obj3.getNum();
x1A = obj4.getNum();
y1A = obj5.getNum();
}
- obj2.free();
- obj3.free();
- obj4.free();
- obj5.free();
} else {
error(errSyntaxWarning, -1, "Missing or invalid Coords in shading dictionary");
- goto err1;
+ return nullptr;
}
- obj1.free();
t0A = 0;
t1A = 1;
- if (dict->lookup("Domain", &obj1)->isArray() &&
- obj1.arrayGetLength() == 2) {
- Object obj3;
- obj1.arrayGet(0, &obj2);
- obj1.arrayGet(1, &obj3);
+ obj1 = dict->lookup("Domain");
+ if (obj1.isArray() && obj1.arrayGetLength() == 2) {
+ Object obj2 = obj1.arrayGet(0);
+ Object obj3 = obj1.arrayGet(1);
if (obj2.isNum() && obj3.isNum()) {
t0A = obj2.getNum();
t1A = obj3.getNum();
}
- obj2.free();
- obj3.free();
}
- obj1.free();
- dict->lookup("Function", &obj1);
+ obj1 = dict->lookup("Function");
if (obj1.isArray()) {
nFuncsA = obj1.arrayGetLength();
if (nFuncsA > gfxColorMaxComps || nFuncsA == 0) {
error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary");
- goto err1;
+ return nullptr;
}
for (i = 0; i < nFuncsA; ++i) {
- obj1.arrayGet(i, &obj2);
+ Object obj2 = obj1.arrayGet(i);
if (!(funcsA[i] = Function::parse(&obj2))) {
- obj1.free();
- obj2.free();
- goto err1;
+ return nullptr;
}
- obj2.free();
}
} else {
nFuncsA = 1;
if (!(funcsA[0] = Function::parse(&obj1))) {
- obj1.free();
- goto err1;
+ return nullptr;
}
}
- obj1.free();
extend0A = extend1A = gFalse;
- if (dict->lookup("Extend", &obj1)->isArray() &&
- obj1.arrayGetLength() == 2) {
- obj1.arrayGet(0, &obj2);
+ obj1 = dict->lookup("Extend");
+ if (obj1.isArray() && obj1.arrayGetLength() == 2) {
+ Object obj2 = obj1.arrayGet(0);
if (obj2.isBool()) {
extend0A = obj2.getBool();
} else {
error(errSyntaxWarning, -1, "Invalid axial shading extend (0)");
}
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
if (obj2.isBool()) {
extend1A = obj2.getBool();
} else {
error(errSyntaxWarning, -1, "Invalid axial shading extend (1)");
}
- obj2.free();
}
- obj1.free();
shading = new GfxAxialShading(x0A, y0A, x1A, y1A, t0A, t1A,
funcsA, nFuncsA, extend0A, extend1A);
if (!shading->init(res, dict, out, state)) {
delete shading;
- return NULL;
+ shading = nullptr;
}
return shading;
-
- err1:
- return NULL;
}
GfxShading *GfxAxialShading::copy() {
@@ -4412,75 +4259,60 @@
Function *funcsA[gfxColorMaxComps];
int nFuncsA;
GBool extend0A, extend1A;
- Object obj1, obj2;
+ Object obj1;
int i;
x0A = y0A = r0A = x1A = y1A = r1A = 0;
- if (dict->lookup("Coords", &obj1)->isArray() &&
- obj1.arrayGetLength() == 6) {
- x0A = obj1.arrayGet(0, &obj2)->getNum();
- obj2.free();
- y0A = obj1.arrayGet(1, &obj2)->getNum();
- obj2.free();
- r0A = obj1.arrayGet(2, &obj2)->getNum();
- obj2.free();
- x1A = obj1.arrayGet(3, &obj2)->getNum();
- obj2.free();
- y1A = obj1.arrayGet(4, &obj2)->getNum();
- obj2.free();
- r1A = obj1.arrayGet(5, &obj2)->getNum();
- obj2.free();
+ obj1 = dict->lookup("Coords");
+ if (obj1.isArray() && obj1.arrayGetLength() == 6) {
+ Object obj2;
+ x0A = (obj2 = obj1.arrayGet(0), obj2.getNum());
+ y0A = (obj2 = obj1.arrayGet(1), obj2.getNum());
+ r0A = (obj2 = obj1.arrayGet(2), obj2.getNum());
+ x1A = (obj2 = obj1.arrayGet(3), obj2.getNum());
+ y1A = (obj2 = obj1.arrayGet(4), obj2.getNum());
+ r1A = (obj2 = obj1.arrayGet(5), obj2.getNum());
} else {
error(errSyntaxWarning, -1, "Missing or invalid Coords in shading dictionary");
- goto err1;
+ return nullptr;
}
- obj1.free();
t0A = 0;
t1A = 1;
- if (dict->lookup("Domain", &obj1)->isArray() &&
- obj1.arrayGetLength() == 2) {
- t0A = obj1.arrayGet(0, &obj2)->getNum();
- obj2.free();
- t1A = obj1.arrayGet(1, &obj2)->getNum();
- obj2.free();
+ obj1 = dict->lookup("Domain");
+ if (obj1.isArray() && obj1.arrayGetLength() == 2) {
+ Object obj2;
+ t0A = (obj2 = obj1.arrayGet(0), obj2.getNum());
+ t1A = (obj2 = obj1.arrayGet(1), obj2.getNum());
}
- obj1.free();
- dict->lookup("Function", &obj1);
+ obj1 = dict->lookup("Function");
if (obj1.isArray()) {
nFuncsA = obj1.arrayGetLength();
if (nFuncsA > gfxColorMaxComps) {
error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary");
- goto err1;
+ return nullptr;
}
for (i = 0; i < nFuncsA; ++i) {
- obj1.arrayGet(i, &obj2);
+ Object obj2 = obj1.arrayGet(i);
if (!(funcsA[i] = Function::parse(&obj2))) {
- obj1.free();
- obj2.free();
- goto err1;
+ return nullptr;
}
- obj2.free();
}
} else {
nFuncsA = 1;
if (!(funcsA[0] = Function::parse(&obj1))) {
- obj1.free();
- goto err1;
+ return nullptr;
}
}
- obj1.free();
extend0A = extend1A = gFalse;
- if (dict->lookup("Extend", &obj1)->isArray() &&
- obj1.arrayGetLength() == 2) {
- extend0A = obj1.arrayGet(0, &obj2)->getBool();
- obj2.free();
- extend1A = obj1.arrayGet(1, &obj2)->getBool();
- obj2.free();
+ obj1 = dict->lookup("Extend");
+ if (obj1.isArray() && obj1.arrayGetLength() == 2) {
+ Object obj2;
+ extend0A = (obj2 = obj1.arrayGet(0), obj2.getBool());
+ extend1A = (obj2 = obj1.arrayGet(1), obj2.getBool());
}
- obj1.free();
shading = new GfxRadialShading(x0A, y0A, r0A, x1A, y1A, r1A, t0A, t1A,
funcsA, nFuncsA, extend0A, extend1A);
@@ -4489,9 +4321,6 @@
return NULL;
}
return shading;
-
- err1:
- return NULL;
}
GfxShading *GfxRadialShading::copy() {
@@ -4943,94 +4772,84 @@
Guint x, y, flag;
Guint c[gfxColorMaxComps];
GfxShadingBitBuf *bitBuf;
- Object obj1, obj2;
+ Object obj1;
int i, j, k, state;
- if (dict->lookup("BitsPerCoordinate", &obj1)->isInt()) {
+ obj1 = dict->lookup("BitsPerCoordinate");
+ if (obj1.isInt()) {
coordBits = obj1.getInt();
} else {
error(errSyntaxWarning, -1, "Missing or invalid BitsPerCoordinate in shading dictionary");
- goto err2;
+ return nullptr;
}
- obj1.free();
- if (dict->lookup("BitsPerComponent", &obj1)->isInt()) {
+ obj1 = dict->lookup("BitsPerComponent");
+ if (obj1.isInt()) {
compBits = obj1.getInt();
} else {
error(errSyntaxWarning, -1, "Missing or invalid BitsPerComponent in shading dictionary");
- goto err2;
+ return nullptr;
}
- obj1.free();
flagBits = vertsPerRow = 0; // make gcc happy
if (typeA == 4) {
- if (dict->lookup("BitsPerFlag", &obj1)->isInt()) {
+ obj1 = dict->lookup("BitsPerFlag");
+ if (obj1.isInt()) {
flagBits = obj1.getInt();
} else {
error(errSyntaxWarning, -1, "Missing or invalid BitsPerFlag in shading dictionary");
- goto err2;
+ return nullptr;
}
- obj1.free();
} else {
- if (dict->lookup("VerticesPerRow", &obj1)->isInt()) {
+ obj1 = dict->lookup("VerticesPerRow");
+ if (obj1.isInt()) {
vertsPerRow = obj1.getInt();
} else {
error(errSyntaxWarning, -1, "Missing or invalid VerticesPerRow in shading dictionary");
- goto err2;
+ return nullptr;
}
- obj1.free();
}
- if (dict->lookup("Decode", &obj1)->isArray() &&
- obj1.arrayGetLength() >= 6) {
- xMin = obj1.arrayGet(0, &obj2)->getNum();
- obj2.free();
- xMax = obj1.arrayGet(1, &obj2)->getNum();
- obj2.free();
+ obj1 = dict->lookup("Decode");
+ if (obj1.isArray() && obj1.arrayGetLength() >= 6) {
+ Object obj2;
+ xMin = (obj2 = obj1.arrayGet(0), obj2.getNum());
+ xMax = (obj2 = obj1.arrayGet(1), obj2.getNum());
xMul = (xMax - xMin) / (pow(2.0, coordBits) - 1);
- yMin = obj1.arrayGet(2, &obj2)->getNum();
- obj2.free();
- yMax = obj1.arrayGet(3, &obj2)->getNum();
- obj2.free();
+ yMin = (obj2 = obj1.arrayGet(2), obj2.getNum());
+ yMax = (obj2 = obj1.arrayGet(3), obj2.getNum());
yMul = (yMax - yMin) / (pow(2.0, coordBits) - 1);
for (i = 0; 5 + 2*i < obj1.arrayGetLength() && i < gfxColorMaxComps; ++i) {
- cMin[i] = obj1.arrayGet(4 + 2*i, &obj2)->getNum();
- obj2.free();
- cMax[i] = obj1.arrayGet(5 + 2*i, &obj2)->getNum();
- obj2.free();
+ cMin[i] = (obj2 = obj1.arrayGet(4 + 2*i), obj2.getNum());
+ cMax[i] = (obj2 = obj1.arrayGet(5 + 2*i), obj2.getNum());
cMul[i] = (cMax[i] - cMin[i]) / (double)((1 << compBits) - 1);
}
nComps = i;
} else {
error(errSyntaxWarning, -1, "Missing or invalid Decode array in shading dictionary");
- goto err2;
+ return nullptr;
}
- obj1.free();
- if (!dict->lookup("Function", &obj1)->isNull()) {
+ obj1 = dict->lookup("Function");
+ if (!obj1.isNull()) {
if (obj1.isArray()) {
nFuncsA = obj1.arrayGetLength();
if (nFuncsA > gfxColorMaxComps) {
error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary");
- goto err1;
+ return nullptr;
}
for (i = 0; i < nFuncsA; ++i) {
- obj1.arrayGet(i, &obj2);
+ Object obj2 = obj1.arrayGet(i);
if (!(funcsA[i] = Function::parse(&obj2))) {
- obj1.free();
- obj2.free();
- goto err1;
+ return nullptr;
}
- obj2.free();
}
} else {
nFuncsA = 1;
if (!(funcsA[0] = Function::parse(&obj1))) {
- obj1.free();
- goto err1;
+ return nullptr;
}
}
} else {
nFuncsA = 0;
}
- obj1.free();
nVerticesA = nTrianglesA = 0;
verticesA = NULL;
@@ -5129,11 +4948,6 @@
return NULL;
}
return shading;
-
- err2:
- obj1.free();
- err1:
- return NULL;
}
GfxShading *GfxGouraudTriangleShading::copy() {
@@ -5294,89 +5108,79 @@
double c[4][gfxColorMaxComps];
Guint ci;
GfxShadingBitBuf *bitBuf;
- Object obj1, obj2;
+ Object obj1;
int i, j;
- if (dict->lookup("BitsPerCoordinate", &obj1)->isInt()) {
+ obj1 = dict->lookup("BitsPerCoordinate");
+ if (obj1.isInt()) {
coordBits = obj1.getInt();
} else {
error(errSyntaxWarning, -1, "Missing or invalid BitsPerCoordinate in shading dictionary");
- goto err2;
+ return nullptr;
}
- obj1.free();
- if (dict->lookup("BitsPerComponent", &obj1)->isInt()) {
+ obj1 = dict->lookup("BitsPerComponent");
+ if (obj1.isInt()) {
compBits = obj1.getInt();
} else {
error(errSyntaxWarning, -1, "Missing or invalid BitsPerComponent in shading dictionary");
- goto err2;
+ return nullptr;
}
- obj1.free();
- if (dict->lookup("BitsPerFlag", &obj1)->isInt()) {
+ obj1 = dict->lookup("BitsPerFlag");
+ if (obj1.isInt()) {
flagBits = obj1.getInt();
} else {
error(errSyntaxWarning, -1, "Missing or invalid BitsPerFlag in shading dictionary");
- goto err2;
+ return nullptr;
}
- obj1.free();
- if (dict->lookup("Decode", &obj1)->isArray() &&
- obj1.arrayGetLength() >= 6) {
+ obj1 = dict->lookup("Decode");
+ if (obj1.isArray() && obj1.arrayGetLength() >= 6) {
bool decodeOk = true;
- xMin = obj1.arrayGet(0, &obj2)->getNum(&decodeOk);
- obj2.free();
- xMax = obj1.arrayGet(1, &obj2)->getNum(&decodeOk);
- obj2.free();
+ Object obj2;
+ xMin = (obj2 = obj1.arrayGet(0), obj2.getNum(&decodeOk));
+ xMax = (obj2 = obj1.arrayGet(1), obj2.getNum(&decodeOk));
xMul = (xMax - xMin) / (pow(2.0, coordBits) - 1);
- yMin = obj1.arrayGet(2, &obj2)->getNum(&decodeOk);
- obj2.free();
- yMax = obj1.arrayGet(3, &obj2)->getNum(&decodeOk);
- obj2.free();
+ yMin = (obj2 = obj1.arrayGet(2), obj2.getNum(&decodeOk));
+ yMax = (obj2 = obj1.arrayGet(3), obj2.getNum(&decodeOk));
yMul = (yMax - yMin) / (pow(2.0, coordBits) - 1);
for (i = 0; 5 + 2*i < obj1.arrayGetLength() && i < gfxColorMaxComps; ++i) {
- cMin[i] = obj1.arrayGet(4 + 2*i, &obj2)->getNum(&decodeOk);
- obj2.free();
- cMax[i] = obj1.arrayGet(5 + 2*i, &obj2)->getNum(&decodeOk);
- obj2.free();
+ cMin[i] = (obj2 = obj1.arrayGet(4 + 2*i), obj2.getNum(&decodeOk));
+ cMax[i] = (obj2 = obj1.arrayGet(5 + 2*i), obj2.getNum(&decodeOk));
cMul[i] = (cMax[i] - cMin[i]) / (double)((1 << compBits) - 1);
}
nComps = i;
if (!decodeOk) {
error(errSyntaxWarning, -1, "Missing or invalid Decode array in shading dictionary");
- goto err2;
+ return nullptr;
}
} else {
error(errSyntaxWarning, -1, "Missing or invalid Decode array in shading dictionary");
- goto err2;
+ return nullptr;
}
- obj1.free();
- if (!dict->lookup("Function", &obj1)->isNull()) {
+ obj1 = dict->lookup("Function");
+ if (!obj1.isNull()) {
if (obj1.isArray()) {
nFuncsA = obj1.arrayGetLength();
if (nFuncsA > gfxColorMaxComps) {
error(errSyntaxWarning, -1, "Invalid Function array in shading dictionary");
- goto err1;
+ return nullptr;
}
for (i = 0; i < nFuncsA; ++i) {
- obj1.arrayGet(i, &obj2);
+ Object obj2 = obj1.arrayGet(i);
if (!(funcsA[i] = Function::parse(&obj2))) {
- obj1.free();
- obj2.free();
- goto err1;
+ return nullptr;
}
- obj2.free();
}
} else {
nFuncsA = 1;
if (!(funcsA[0] = Function::parse(&obj1))) {
- obj1.free();
- goto err1;
+ return nullptr;
}
}
} else {
nFuncsA = 0;
}
- obj1.free();
nPatchesA = 0;
patchesA = NULL;
@@ -5477,7 +5281,7 @@
break;
case 1:
if (nPatchesA == 0) {
- goto err1;
+ return nullptr;
}
p->x[0][0] = patchesA[nPatchesA-1].x[0][3];
p->y[0][0] = patchesA[nPatchesA-1].y[0][3];
@@ -5512,7 +5316,7 @@
break;
case 2:
if (nPatchesA == 0) {
- goto err1;
+ return nullptr;
}
p->x[0][0] = patchesA[nPatchesA-1].x[3][3];
p->y[0][0] = patchesA[nPatchesA-1].y[3][3];
@@ -5547,7 +5351,7 @@
break;
case 3:
if (nPatchesA == 0) {
- goto err1;
+ return nullptr;
}
p->x[0][0] = patchesA[nPatchesA-1].x[3][0];
p->y[0][0] = patchesA[nPatchesA-1].y[3][0];
@@ -5625,7 +5429,7 @@
break;
case 1:
if (nPatchesA == 0) {
- goto err1;
+ return nullptr;
}
p->x[0][0] = patchesA[nPatchesA-1].x[0][3];
p->y[0][0] = patchesA[nPatchesA-1].y[0][3];
@@ -5668,7 +5472,7 @@
break;
case 2:
if (nPatchesA == 0) {
- goto err1;
+ return nullptr;
}
p->x[0][0] = patchesA[nPatchesA-1].x[3][3];
p->y[0][0] = patchesA[nPatchesA-1].y[3][3];
@@ -5711,7 +5515,7 @@
break;
case 3:
if (nPatchesA == 0) {
- goto err1;
+ return nullptr;
}
p->x[0][0] = patchesA[nPatchesA-1].x[3][0];
p->y[0][0] = patchesA[nPatchesA-1].y[3][0];
@@ -5809,14 +5613,9 @@
funcsA, nFuncsA);
if (!shading->init(res, dict, out, state)) {
delete shading;
- return NULL;
+ return nullptr;
}
return shading;
-
- err2:
- obj1.free();
- err1:
- return NULL;
}
void GfxPatchMeshShading::getParameterizedColor(double t, GfxColor *color) {
@@ -5845,7 +5644,6 @@
int maxPixel, indexHigh;
Guchar *indexedLookup;
Function *sepFunc;
- Object obj;
double x[gfxColorMaxComps];
double y[gfxColorMaxComps];
int i, j, k;
@@ -5887,18 +5685,16 @@
nComps = colorSpace->getNComps();
}
for (i = 0; i < nComps; ++i) {
- decode->arrayGet(2*i, &obj);
+ Object obj = decode->arrayGet(2*i);
if (!obj.isNum()) {
- goto err2;
+ goto err1;
}
decodeLow[i] = obj.getNum();
- obj.free();
- decode->arrayGet(2*i+1, &obj);
+ obj = decode->arrayGet(2*i+1);
if (!obj.isNum()) {
- goto err2;
+ goto err1;
}
decodeRange[i] = obj.getNum() - decodeLow[i];
- obj.free();
}
} else {
goto err1;
@@ -6003,8 +5799,6 @@
return;
- err2:
- obj.free();
err1:
ok = gFalse;
}
@@ -7328,7 +7122,6 @@
}
GBool GfxState::parseBlendMode(Object *obj, GfxBlendMode *mode) {
- Object obj2;
int i, j;
if (obj->isName()) {
@@ -7341,19 +7134,16 @@
return gFalse;
} else if (obj->isArray()) {
for (i = 0; i < obj->arrayGetLength(); ++i) {
- obj->arrayGet(i, &obj2);
+ Object obj2 = obj->arrayGet(i);
if (!obj2.isName()) {
- obj2.free();
return gFalse;
}
for (j = 0; j < nGfxBlendModeNames; ++j) {
if (!strcmp(obj2.getName(), gfxBlendModeNames[j].name)) {
- obj2.free();
*mode = gfxBlendModeNames[j].mode;
return gTrue;
}
}
- obj2.free();
}
*mode = gfxBlendNormal;
return gTrue;
diff --git a/poppler/Hints.cc b/poppler/Hints.cc
index 7f11304..270b6e4 100644
--- a/poppler/Hints.cc
+++ b/poppler/Hints.cc
@@ -5,7 +5,7 @@
// This file is licensed under the GPLv2 or later
//
// Copyright 2010, 2012 Hib Eris <hib@hiberis.nl>
-// Copyright 2010, 2011, 2013, 2014, 2016 Albert Astals Cid <aacid@kde.org>
+// Copyright 2010, 2011, 2013, 2014, 2016, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright 2010, 2013 Pino Toscano <pino@kde.org>
// Copyright 2013 Adrian Johnson <ajohnson@redneon.com>
// Copyright 2014 Fabio D'Urso <fabiodurso@hotmail.it>
@@ -181,42 +181,38 @@
hintsLength2 = linearization->getHintsLength2();
Parser *parser;
- Object obj;
int bufLength = hintsLength + hintsLength2;
std::vector<char> buf(bufLength);
char *p = &buf[0];
- obj.initNull();
- Stream *s = str->makeSubStream(hintsOffset, gFalse, hintsLength, &obj);
+ Stream *s = str->makeSubStream(hintsOffset, gFalse, hintsLength, Object(objNull));
s->reset();
for (Guint i=0; i < hintsLength; i++) { *p++ = s->getChar(); }
delete s;
if (hintsOffset2 && hintsLength2) {
- obj.initNull();
- s = str->makeSubStream(hintsOffset2, gFalse, hintsLength2, &obj);
+ s = str->makeSubStream(hintsOffset2, gFalse, hintsLength2, Object(objNull));
s->reset();
for (Guint i=0; i < hintsLength2; i++) { *p++ = s->getChar(); }
delete s;
}
- obj.initNull();
- MemStream *memStream = new MemStream (&buf[0], 0, bufLength, &obj);
+ MemStream *memStream = new MemStream (&buf[0], 0, bufLength, Object(objNull));
- obj.initNull();
parser = new Parser(xref, new Lexer(xref, memStream), gTrue);
int num, gen;
- if (parser->getObj(&obj)->isInt() &&
- (num = obj.getInt(), obj.free(), parser->getObj(&obj)->isInt()) &&
- (gen = obj.getInt(), obj.free(), parser->getObj(&obj)->isCmd("obj")) &&
- (obj.free(), parser->getObj(&obj, gFalse,
+ Object obj;
+ if ((obj = parser->getObj(), obj.isInt()) &&
+ (num = obj.getInt(), obj = parser->getObj(), obj.isInt()) &&
+ (gen = obj.getInt(), obj = parser->getObj(), obj.isCmd("obj")) &&
+ (obj = parser->getObj(gFalse,
secHdlr ? secHdlr->getFileKey() : (Guchar *)NULL,
secHdlr ? secHdlr->getEncAlgorithm() : cryptRC4,
secHdlr ? secHdlr->getFileKeyLength() : 0,
- num, gen, 0, gTrue)->isStream())) {
+ num, gen, 0, gTrue), obj.isStream())) {
Stream *hintsStream = obj.getStream();
Dict *hintsDict = obj.streamGetDict();
@@ -238,7 +234,6 @@
} else {
error(errSyntaxWarning, -1, "Failed parsing hints table object");
}
- obj.free();
delete parser;
}
diff --git a/poppler/JBIG2Stream.cc b/poppler/JBIG2Stream.cc
index d89108c..50c6eee 100644
--- a/poppler/JBIG2Stream.cc
+++ b/poppler/JBIG2Stream.cc
@@ -1201,7 +1201,7 @@
mmrDecoder = new JBIG2MMRDecoder();
if (globalsStreamA->isStream()) {
- globalsStreamA->copy(&globalsStream);
+ globalsStream = globalsStreamA->copy();
if (globalsStreamRefA->isRef())
globalsStreamRef = globalsStreamRefA->getRef();
}
@@ -1213,7 +1213,6 @@
JBIG2Stream::~JBIG2Stream() {
close();
- globalsStream.free();
delete arithDecoder;
delete genericRegionStats;
delete refinementRegionStats;
diff --git a/poppler/JPEG2000Stream.cc b/poppler/JPEG2000Stream.cc
index 7daa23d..2b6af90 100644
--- a/poppler/JPEG2000Stream.cc
+++ b/poppler/JPEG2000Stream.cc
@@ -4,7 +4,7 @@
//
// A JPX stream decoder using OpenJPEG
//
-// Copyright 2008-2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright 2008-2010, 2012, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright 2011 Daniel Glöckner <daniel-gl@gmx.net>
// Copyright 2014, 2016 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright 2013, 2014 Adrian Johnson <ajohnson@redneon.com>
@@ -363,25 +363,22 @@
void JPXStream::init()
{
Object oLen, cspace, smaskInData;
- if (getDict()) getDict()->lookup("Length", &oLen);
- if (getDict()) getDict()->lookup("ColorSpace", &cspace);
- if (getDict()) getDict()->lookup("SMaskInData", &smaskInData);
+ if (getDict()) {
+ oLen = getDict()->lookup("Length");
+ cspace = getDict()->lookup("ColorSpace");
+ smaskInData = getDict()->lookup("SMaskInData");
+ }
int bufSize = BUFFER_INITIAL_SIZE;
if (oLen.isInt()) bufSize = oLen.getInt();
- oLen.free();
if (cspace.isArray() && cspace.arrayGetLength() > 0) {
- Object cstype;
- cspace.arrayGet(0, &cstype);
+ Object cstype = cspace.arrayGet(0);
if (cstype.isName("Indexed")) priv->indexed = gTrue;
- cstype.free();
}
- cspace.free();
priv->smaskInData = 0;
if (smaskInData.isInt()) priv->smaskInData = smaskInData.getInt();
- smaskInData.free();
int length = 0;
unsigned char *buf = str->toUnsignedChars(&length, bufSize);
@@ -504,6 +501,7 @@
return;
error:
+ opj_stream_destroy(stream);
opj_destroy_codec(decoder);
if (format == OPJ_CODEC_JP2) {
error(errSyntaxWarning, -1, "Did no succeed opening JPX Stream as JP2, trying as J2K.");
diff --git a/poppler/Lexer.cc b/poppler/Lexer.cc
index 952967a..d2329b5 100644
--- a/poppler/Lexer.cc
+++ b/poppler/Lexer.cc
@@ -13,7 +13,7 @@
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
-// Copyright (C) 2006-2010, 2012-2014 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006-2010, 2012-2014, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
// Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright (C) 2012, 2013 Adrian Johnson <ajohnson@redneon.com>
@@ -70,36 +70,33 @@
//------------------------------------------------------------------------
Lexer::Lexer(XRef *xrefA, Stream *str) {
- Object obj;
-
lookCharLastValueCached = LOOK_VALUE_NOT_CACHED;
xref = xrefA;
- curStr.initStream(str);
+ curStr = Object(str);
streams = new Array(xref);
- streams->add(curStr.copy(&obj));
+ streams->add(curStr.copy());
strPtr = 0;
freeArray = gTrue;
curStr.streamReset();
}
Lexer::Lexer(XRef *xrefA, Object *obj) {
- Object obj2;
-
lookCharLastValueCached = LOOK_VALUE_NOT_CACHED;
xref = xrefA;
if (obj->isStream()) {
+ Object obj2;
streams = new Array(xref);
freeArray = gTrue;
- streams->add(obj->copy(&obj2));
+ streams->add(obj->copy());
} else {
streams = obj->getArray();
freeArray = gFalse;
}
strPtr = 0;
if (streams->getLength() > 0) {
- streams->get(strPtr, &curStr);
+ curStr = streams->get(strPtr);
curStr.streamReset();
}
}
@@ -107,7 +104,6 @@
Lexer::~Lexer() {
if (!curStr.isNone()) {
curStr.streamClose();
- curStr.free();
}
if (freeArray) {
delete streams;
@@ -129,10 +125,10 @@
return EOF;
} else {
curStr.streamClose();
- curStr.free();
+ curStr = Object();
++strPtr;
if (strPtr < streams->getLength()) {
- streams->get(strPtr, &curStr);
+ curStr = streams->get(strPtr);
curStr.streamReset();
}
}
@@ -154,7 +150,7 @@
}
}
-Object *Lexer::getObj(Object *obj, int objNum) {
+Object Lexer::getObj(int objNum) {
char *p;
int c, c2;
GBool comment, neg, done, overflownInteger, overflownLongLong;
@@ -169,7 +165,7 @@
comment = gFalse;
while (1) {
if ((c = getChar()) == EOF) {
- return obj->initEOF();
+ return Object(objEOF);
}
if (comment) {
if (c == '\r' || c == '\n')
@@ -236,16 +232,16 @@
}
if (unlikely(overflownInteger)) {
if (overflownLongLong) {
- obj->initReal(xf);
+ return Object(xf);
} else {
if (unlikely(xll == INT_MIN)) {
- obj->initInt(INT_MIN);
+ return Object(static_cast<int>(INT_MIN));
} else {
- obj->initInt64(xll);
+ return Object(xll);
}
}
} else {
- obj->initInt(xi);
+ return Object(xi);
}
break;
doReal:
@@ -274,7 +270,7 @@
if (neg) {
xf = -xf;
}
- obj->initReal(xf);
+ return Object(xf);
break;
// string
@@ -401,9 +397,9 @@
s = new GooString(tokBuf, n);
else
s->append(tokBuf, n);
- obj->initString(s);
+ return Object(s);
} else {
- obj->initEOF();
+ return Object(objEOF);
}
break;
@@ -455,10 +451,11 @@
}
if (n < tokBufSize) {
*p = '\0';
- obj->initName(tokBuf);
+ return Object(objName, tokBuf);
} else {
- obj->initName(s->getCString());
+ Object obj(objName, s->getCString());
delete s;
+ return obj;
}
break;
@@ -467,7 +464,7 @@
case ']':
tokBuf[0] = c;
tokBuf[1] = '\0';
- obj->initCmd(tokBuf);
+ return Object(objCmd, tokBuf);
break;
// hex string or dict punctuation
@@ -479,7 +476,7 @@
getChar();
tokBuf[0] = tokBuf[1] = '<';
tokBuf[2] = '\0';
- obj->initCmd(tokBuf);
+ return Object(objCmd, tokBuf);
// hex string
} else {
@@ -526,7 +523,7 @@
s->append(tokBuf, n);
if (m == 1)
s->append((char)(c2 << 4));
- obj->initString(s);
+ return Object(s);
}
break;
@@ -537,10 +534,10 @@
getChar();
tokBuf[0] = tokBuf[1] = '>';
tokBuf[2] = '\0';
- obj->initCmd(tokBuf);
+ return Object(objCmd, tokBuf);
} else {
error(errSyntaxError, getPos(), "Illegal character '>'");
- obj->initError();
+ return Object(objError);
}
break;
@@ -549,7 +546,7 @@
case '{':
case '}':
error(errSyntaxError, getPos(), "Illegal character '{0:c}'", c);
- obj->initError();
+ return Object(objError);
break;
// command
@@ -567,21 +564,21 @@
}
*p = '\0';
if (tokBuf[0] == 't' && !strcmp(tokBuf, "true")) {
- obj->initBool(gTrue);
+ return Object(gTrue);
} else if (tokBuf[0] == 'f' && !strcmp(tokBuf, "false")) {
- obj->initBool(gFalse);
+ return Object(gFalse);
} else if (tokBuf[0] == 'n' && !strcmp(tokBuf, "null")) {
- obj->initNull();
+ return Object(objNull);
} else {
- obj->initCmd(tokBuf);
+ return Object(objCmd, tokBuf);
}
break;
}
- return obj;
+ return Object();
}
-Object *Lexer::getObj(Object *obj, const char *cmdA, int objNum) {
+Object Lexer::getObj(const char *cmdA, int objNum) {
char *p;
int c;
GBool comment;
@@ -594,7 +591,7 @@
while (strcmp(cmdA, cmd1) && (objNum < 0 || (xref && xref->getNumEntry(getPos()) == objNum))) {
while (1) {
if ((c = getChar()) == EOF) {
- return obj->initEOF();
+ return Object(objEOF);
}
if (comment) {
if (c == '\r' || c == '\n') {
@@ -618,9 +615,8 @@
}
*p = '\0';
}
- obj->initCmd(tokBuf);
-
- return obj;
+
+ return Object(objCmd, tokBuf);
}
void Lexer::skipToNextLine() {
diff --git a/poppler/Lexer.h b/poppler/Lexer.h
index 02b6cdc..ac3334c 100644
--- a/poppler/Lexer.h
+++ b/poppler/Lexer.h
@@ -13,7 +13,7 @@
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
-// Copyright (C) 2006, 2007, 2010, 2013 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006, 2007, 2010, 2013, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com>
// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
@@ -56,8 +56,9 @@
~Lexer();
// Get the next object from the input stream.
- Object *getObj(Object *obj, int objNum = -1);
- Object *getObj(Object *obj, const char *cmdA, int objNum);
+ Object getObj(int objNum = -1);
+ Object getObj(const char *cmdA, int objNum);
+ template<typename T> Object getObj(T) = delete;
// Skip to the beginning of the next line in the input stream.
void skipToNextLine();
diff --git a/poppler/Linearization.cc b/poppler/Linearization.cc
index be041f9..49008a3 100644
--- a/poppler/Linearization.cc
+++ b/poppler/Linearization.cc
@@ -6,6 +6,7 @@
//
// Copyright 2010, 2012 Hib Eris <hib@hiberis.nl>
// Copyright 2015 Jason Crain <jason@aquaticape.us>
+// Copyright 2017 Albert Astals Cid <aacid@kde.org>
//
//========================================================================
@@ -20,36 +21,26 @@
Linearization::Linearization (BaseStream *str)
{
Parser *parser;
- Object obj1, obj2, obj3, obj5;
-
- linDict.initNull();
str->reset();
- obj1.initNull();
parser = new Parser(NULL,
- new Lexer(NULL, str->makeSubStream(str->getStart(), gFalse, 0, &obj1)),
+ new Lexer(NULL, str->makeSubStream(str->getStart(), gFalse, 0, Object(objNull))),
gFalse);
- parser->getObj(&obj1);
- parser->getObj(&obj2);
- parser->getObj(&obj3);
- parser->getObj(&linDict);
+ Object obj1 = parser->getObj();
+ Object obj2 = parser->getObj();
+ Object obj3 = parser->getObj();
+ linDict = parser->getObj();
if (obj1.isInt() && obj2.isInt() && obj3.isCmd("obj") && linDict.isDict()) {
- linDict.dictLookup("Linearized", &obj5);
+ Object obj5 = linDict.dictLookup("Linearized");
if (!(obj5.isNum() && obj5.getNum() > 0)) {
- linDict.free();
- linDict.initNull();
+ linDict.setToNull();
}
- obj5.free();
}
- obj3.free();
- obj2.free();
- obj1.free();
delete parser;
}
Linearization:: ~Linearization()
{
- linDict.free();
}
Guint Linearization::getLength()
@@ -72,17 +63,15 @@
Object obj1, obj2;
if (linDict.isDict() &&
- linDict.dictLookup("H", &obj1)->isArray() &&
+ (obj1 = linDict.dictLookup("H"), obj1.isArray()) &&
obj1.arrayGetLength()>=2 &&
- obj1.arrayGet(0, &obj2)->isInt() &&
+ (obj2 = obj1.arrayGet(0), obj2.isInt()) &&
obj2.getInt() > 0) {
hintsOffset = obj2.getInt();
} else {
error(errSyntaxWarning, -1, "Hints table offset in linearization table is invalid");
hintsOffset = 0;
}
- obj2.free();
- obj1.free();
return hintsOffset;
}
@@ -93,17 +82,15 @@
Object obj1, obj2;
if (linDict.isDict() &&
- linDict.dictLookup("H", &obj1)->isArray() &&
+ (obj1 = linDict.dictLookup("H"), obj1.isArray()) &&
obj1.arrayGetLength()>=2 &&
- obj1.arrayGet(1, &obj2)->isInt() &&
+ (obj2 = obj1.arrayGet(1), obj2.isInt()) &&
obj2.getInt() > 0) {
hintsLength = obj2.getInt();
} else {
error(errSyntaxWarning, -1, "Hints table length in linearization table is invalid");
hintsLength = 0;
}
- obj2.free();
- obj1.free();
return hintsLength;
}
@@ -112,20 +99,18 @@
{
int hintsOffset2 = 0; // default to 0
- Object obj1, obj2;
+ Object obj1;
if (linDict.isDict() &&
- linDict.dictLookup("H", &obj1)->isArray() &&
+ (obj1 = linDict.dictLookup("H"), obj1.isArray()) &&
obj1.arrayGetLength()>=4) {
- if (obj1.arrayGet(2, &obj2)->isInt() &&
- obj2.getInt() > 0) {
+ Object obj2 = obj1.arrayGet(2);
+ if (obj2.isInt() && obj2.getInt() > 0) {
hintsOffset2 = obj2.getInt();
} else {
error(errSyntaxWarning, -1, "Second hints table offset in linearization table is invalid");
hintsOffset2 = 0;
}
}
- obj2.free();
- obj1.free();
return hintsOffset2;
}
@@ -134,20 +119,18 @@
{
int hintsLength2 = 0; // default to 0
- Object obj1, obj2;
+ Object obj1;
if (linDict.isDict() &&
- linDict.dictLookup("H", &obj1)->isArray() &&
+ (obj1 = linDict.dictLookup("H"), obj1.isArray()) &&
obj1.arrayGetLength()>=4) {
- if (obj1.arrayGet(3, &obj2)->isInt() &&
- obj2.getInt() > 0) {
+ Object obj2 = obj1.arrayGet(3);
+ if (obj2.isInt() && obj2.getInt() > 0) {
hintsLength2 = obj2.getInt();
} else {
error(errSyntaxWarning, -1, "Second hints table length in linearization table is invalid");
hintsLength2 = 0;
}
}
- obj2.free();
- obj1.free();
return hintsLength2;
}
diff --git a/poppler/Link.cc b/poppler/Link.cc
index d4680db..d7bbc33 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -16,7 +16,7 @@
// Copyright (C) 2006, 2008 Pino Toscano <pino@kde.org>
// Copyright (C) 2007, 2010, 2011 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright (C) 2008 Hugo Mercier <hmercier31@gmail.com>
-// Copyright (C) 2008-2010, 2012-2014, 2016 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008-2010, 2012-2014, 2016, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net>
// Copyright (C) 2009 Ilya Gorenbein <igorenbein@finjan.com>
// Copyright (C) 2012 Tobias Koening <tobias.koenig@kdab.com>
@@ -64,7 +64,6 @@
LinkAction *LinkAction::parseAction(Object *obj, GooString *baseURI) {
LinkAction *action;
- Object obj2, obj3, obj4;
if (!obj->isDict()) {
error(errSyntaxWarning, -1, "parseAction: Bad annotation action for URI '{0:s}'",
@@ -72,21 +71,18 @@
return NULL;
}
- obj->dictLookup("S", &obj2);
+ Object obj2 = obj->dictLookup("S");
// GoTo action
if (obj2.isName("GoTo")) {
- obj->dictLookup("D", &obj3);
+ Object obj3 = obj->dictLookup("D");
action = new LinkGoTo(&obj3);
- obj3.free();
// GoToR action
} else if (obj2.isName("GoToR")) {
- obj->dictLookup("F", &obj3);
- obj->dictLookup("D", &obj4);
+ Object obj3 = obj->dictLookup("F");
+ Object obj4 = obj->dictLookup("D");
action = new LinkGoToR(&obj3, &obj4);
- obj3.free();
- obj4.free();
// Launch action
} else if (obj2.isName("Launch")) {
@@ -94,15 +90,13 @@
// URI action
} else if (obj2.isName("URI")) {
- obj->dictLookup("URI", &obj3);
+ Object obj3 = obj->dictLookup("URI");
action = new LinkURI(&obj3, baseURI);
- obj3.free();
// Named action
} else if (obj2.isName("Named")) {
- obj->dictLookup("N", &obj3);
+ Object obj3 = obj->dictLookup("N");
action = new LinkNamed(&obj3);
- obj3.free();
// Movie action
} else if (obj2.isName("Movie")) {
@@ -118,9 +112,8 @@
// JavaScript action
} else if (obj2.isName("JavaScript")) {
- obj->dictLookup("JS", &obj3);
+ Object obj3 = obj->dictLookup("JS");
action = new LinkJavaScript(&obj3);
- obj3.free();
// Set-OCG-State action
} else if (obj2.isName("SetOCGState")) {
@@ -137,8 +130,6 @@
action = NULL;
}
- obj2.free();
-
if (action && !action->isOk()) {
delete action;
return NULL;
@@ -151,8 +142,6 @@
//------------------------------------------------------------------------
LinkDest::LinkDest(Array *a) {
- Object obj1, obj2;
-
// initialize fields
left = bottom = right = top = zoom = 0;
changeLeft = changeTop = changeZoom = gFalse;
@@ -163,7 +152,7 @@
error(errSyntaxWarning, -1, "Annotation destination array is too short");
return;
}
- a->getNF(0, &obj1);
+ Object obj1 = a->getNF(0);
if (obj1.isInt()) {
pageNum = obj1.getInt() + 1;
pageIsRef = gFalse;
@@ -173,12 +162,11 @@
pageIsRef = gTrue;
} else {
error(errSyntaxWarning, -1, "Bad annotation destination");
- goto err2;
+ return;
}
- obj1.free();
// get destination type
- a->get(1, &obj1);
+ obj1 = a->get(1);
// XYZ link
if (obj1.isName("XYZ")) {
@@ -186,7 +174,7 @@
if (a->getLength() < 3) {
changeLeft = gFalse;
} else {
- a->get(2, &obj2);
+ Object obj2 = a->get(2);
if (obj2.isNull()) {
changeLeft = gFalse;
} else if (obj2.isNum()) {
@@ -194,14 +182,13 @@
left = obj2.getNum();
} else {
error(errSyntaxWarning, -1, "Bad annotation destination position");
- goto err1;
+ return;
}
- obj2.free();
}
if (a->getLength() < 4) {
changeTop = gFalse;
} else {
- a->get(3, &obj2);
+ Object obj2 = a->get(3);
if (obj2.isNull()) {
changeTop = gFalse;
} else if (obj2.isNum()) {
@@ -209,14 +196,13 @@
top = obj2.getNum();
} else {
error(errSyntaxWarning, -1, "Bad annotation destination position");
- goto err1;
+ return;
}
- obj2.free();
}
if (a->getLength() < 5) {
changeZoom = gFalse;
} else {
- a->get(4, &obj2);
+ Object obj2 = a->get(4);
if (obj2.isNull()) {
changeZoom = gFalse;
} else if (obj2.isNum()) {
@@ -224,9 +210,8 @@
changeZoom = (zoom == 0) ? gFalse : gTrue;
} else {
error(errSyntaxWarning, -1, "Bad annotation destination position");
- goto err1;
+ return;
}
- obj2.free();
}
// Fit link
@@ -239,7 +224,7 @@
if (a->getLength() < 3) {
changeTop = gFalse;
} else {
- a->get(2, &obj2);
+ Object obj2 = a->get(2);
if (obj2.isNull()) {
changeTop = gFalse;
} else if (obj2.isNum()) {
@@ -249,17 +234,16 @@
error(errSyntaxWarning, -1, "Bad annotation destination position");
kind = destFit;
}
- obj2.free();
}
// FitV link
} else if (obj1.isName("FitV")) {
if (a->getLength() < 3) {
error(errSyntaxWarning, -1, "Annotation destination array is too short");
- goto err2;
+ return;
}
kind = destFitV;
- a->get(2, &obj2);
+ Object obj2 = a->get(2);
if (obj2.isNull()) {
changeLeft = gFalse;
} else if (obj2.isNum()) {
@@ -269,43 +253,42 @@
error(errSyntaxWarning, -1, "Bad annotation destination position");
kind = destFit;
}
- obj2.free();
// FitR link
} else if (obj1.isName("FitR")) {
if (a->getLength() < 6) {
error(errSyntaxWarning, -1, "Annotation destination array is too short");
- goto err2;
+ return;
}
kind = destFitR;
- if (a->get(2, &obj2)->isNum()) {
+ Object obj2 = a->get(2);
+ if (obj2.isNum()) {
left = obj2.getNum();
} else {
error(errSyntaxWarning, -1, "Bad annotation destination position");
kind = destFit;
}
- obj2.free();
- if (a->get(3, &obj2)->isNum()) {
+ obj2 = a->get(3);
+ if (obj2.isNum()) {
bottom = obj2.getNum();
} else {
error(errSyntaxWarning, -1, "Bad annotation destination position");
kind = destFit;
}
- obj2.free();
- if (a->get(4, &obj2)->isNum()) {
+ obj2 = a->get(4);
+ if (obj2.isNum()) {
right = obj2.getNum();
} else {
error(errSyntaxWarning, -1, "Bad annotation destination position");
kind = destFit;
}
- obj2.free();
- if (a->get(5, &obj2)->isNum()) {
+ obj2 = a->get(5);
+ if (obj2.isNum()) {
top = obj2.getNum();
} else {
error(errSyntaxWarning, -1, "Bad annotation destination position");
kind = destFit;
}
- obj2.free();
// FitB link
} else if (obj1.isName("FitB")) {
@@ -315,10 +298,10 @@
} else if (obj1.isName("FitBH")) {
if (a->getLength() < 3) {
error(errSyntaxWarning, -1, "Annotation destination array is too short");
- goto err2;
+ return;
}
kind = destFitBH;
- a->get(2, &obj2);
+ Object obj2 = a->get(2);
if (obj2.isNull()) {
changeTop = gFalse;
} else if (obj2.isNum()) {
@@ -328,16 +311,15 @@
error(errSyntaxWarning, -1, "Bad annotation destination position");
kind = destFit;
}
- obj2.free();
// FitBV link
} else if (obj1.isName("FitBV")) {
if (a->getLength() < 3) {
error(errSyntaxWarning, -1, "Annotation destination array is too short");
- goto err2;
+ return;
}
kind = destFitBV;
- a->get(2, &obj2);
+ Object obj2 = a->get(2);
if (obj2.isNull()) {
changeLeft = gFalse;
} else if (obj2.isNum()) {
@@ -347,22 +329,14 @@
error(errSyntaxWarning, -1, "Bad annotation destination position");
kind = destFit;
}
- obj2.free();
// unknown link kind
} else {
error(errSyntaxWarning, -1, "Unknown annotation destination type");
- goto err2;
}
- obj1.free();
ok = gTrue;
return;
-
- err1:
- obj2.free();
- err2:
- obj1.free();
}
LinkDest::LinkDest(LinkDest *dest) {
@@ -428,10 +402,9 @@
namedDest = NULL;
// get file name
- Object obj1;
- if (getFileSpecNameForPlatform (fileSpecObj, &obj1)) {
+ Object obj1 = getFileSpecNameForPlatform (fileSpecObj);
+ if (obj1.isString()) {
fileName = obj1.getString()->copy();
- obj1.free();
}
// named destination
@@ -469,54 +442,49 @@
//------------------------------------------------------------------------
LinkLaunch::LinkLaunch(Object *actionObj) {
- Object obj1, obj2, obj3;
fileName = NULL;
params = NULL;
if (actionObj->isDict()) {
- if (!actionObj->dictLookup("F", &obj1)->isNull()) {
- if (getFileSpecNameForPlatform (&obj1, &obj3)) {
+ Object obj1 = actionObj->dictLookup("F");
+ if (!obj1.isNull()) {
+ Object obj3 = getFileSpecNameForPlatform (&obj1);
+ if (obj3.isString()) {
fileName = obj3.getString()->copy();
- obj3.free();
}
} else {
- obj1.free();
#ifdef _WIN32
if (actionObj->dictLookup("Win", &obj1)->isDict()) {
obj1.dictLookup("F", &obj2);
if (getFileSpecNameForPlatform (&obj2, &obj3)) {
fileName = obj3.getString()->copy();
- obj3.free();
}
- obj2.free();
if (obj1.dictLookup("P", &obj2)->isString()) {
params = obj2.getString()->copy();
}
- obj2.free();
} else {
error(errSyntaxWarning, -1, "Bad launch-type link action");
}
#else
//~ This hasn't been defined by Adobe yet, so assume it looks
//~ just like the Win dictionary until they say otherwise.
- if (actionObj->dictLookup("Unix", &obj1)->isDict()) {
- obj1.dictLookup("F", &obj2);
- if (getFileSpecNameForPlatform (&obj2, &obj3)) {
+ obj1 = actionObj->dictLookup("Unix");
+ if (obj1.isDict()) {
+ Object obj2 = obj1.dictLookup("F");
+ Object obj3 = getFileSpecNameForPlatform (&obj2);
+ if (obj3.isString()) {
fileName = obj3.getString()->copy();
- obj3.free();
}
- obj2.free();
- if (obj1.dictLookup("P", &obj2)->isString()) {
+ obj2 = obj1.dictLookup("P");
+ if (obj2.isString()) {
params = obj2.getString()->copy();
}
- obj2.free();
} else {
error(errSyntaxWarning, -1, "Bad launch-type link action");
}
#endif
}
- obj1.free();
}
}
@@ -601,23 +569,23 @@
annotRef.num = -1;
annotTitle = NULL;
- Object tmp;
- if (obj->dictLookupNF("Annotation", &tmp)->isRef()) {
+ Object tmp = obj->dictLookupNF("Annotation");
+ if (tmp.isRef()) {
annotRef = tmp.getRef();
}
- tmp.free();
- if (obj->dictLookup("T", &tmp)->isString()) {
+ tmp = obj->dictLookup("T");
+ if (tmp.isString()) {
annotTitle = tmp.getString()->copy();
}
- tmp.free();
if ((annotTitle == NULL) && (annotRef.num == -1)) {
error(errSyntaxError, -1,
"Movie action is missing both the Annot and T keys");
}
- if (obj->dictLookup("Operation", &tmp)->isName()) {
+ tmp = obj->dictLookup("Operation");
+ if (tmp.isName()) {
char *name = tmp.getName();
if (!strcmp(name, "Play")) {
@@ -633,7 +601,6 @@
operation = operationTypeResume;
}
}
- tmp.free();
}
LinkMovie::~LinkMovie() {
@@ -654,35 +621,29 @@
sound = NULL;
if (soundObj->isDict())
{
- Object tmp;
// volume
- soundObj->dictLookup("Volume", &tmp);
+ Object tmp = soundObj->dictLookup("Volume");
if (tmp.isNum()) {
volume = tmp.getNum();
}
- tmp.free();
// sync
- soundObj->dictLookup("Synchronous", &tmp);
+ tmp = soundObj->dictLookup("Synchronous");
if (tmp.isBool()) {
sync = tmp.getBool();
}
- tmp.free();
// repeat
- soundObj->dictLookup("Repeat", &tmp);
+ tmp = soundObj->dictLookup("Repeat");
if (tmp.isBool()) {
repeat = tmp.getBool();
}
- tmp.free();
// mix
- soundObj->dictLookup("Mix", &tmp);
+ tmp = soundObj->dictLookup("Mix");
if (tmp.isBool()) {
mix = tmp.getBool();
}
- tmp.free();
// 'Sound' object
- soundObj->dictLookup("Sound", &tmp);
+ tmp = soundObj->dictLookup("Sound");
sound = Sound::parseSound(&tmp);
- tmp.free();
}
}
@@ -701,9 +662,8 @@
int operationCode = -1;
if (obj->isDict()) {
- Object tmp;
-
- if (!obj->dictLookup("JS", &tmp)->isNull()) {
+ Object tmp = obj->dictLookup("JS");
+ if (!tmp.isNull()) {
if (tmp.isString()) {
js = new GooString(tmp.getString());
} else if (tmp.isStream()) {
@@ -714,9 +674,9 @@
error(errSyntaxWarning, -1, "Invalid Rendition Action: JS not string or stream");
}
}
- tmp.free();
- if (obj->dictLookup("OP", &tmp)->isInt()) {
+ tmp = obj->dictLookup("OP");
+ if (tmp.isInt()) {
operationCode = tmp.getInt();
if (!js && (operationCode < 0 || operationCode > 4)) {
error(errSyntaxWarning, -1, "Invalid Rendition Action: unrecognized operation valued: {0:d}", operationCode);
@@ -724,16 +684,18 @@
Object obj1;
// retrieve rendition object
- if (obj->dictLookup("R", &renditionObj)->isDict()) {
+ renditionObj = obj->dictLookup("R");
+ if (renditionObj.isDict()) {
media = new MediaRendition(&renditionObj);
} else if (operationCode == 0 || operationCode == 4) {
error(errSyntaxWarning, -1, "Invalid Rendition Action: no R field with op = {0:d}", operationCode);
- renditionObj.free();
+ renditionObj.setToNull();
}
- if (!obj->dictLookupNF("AN", &screenRef)->isRef() && operation >= 0 && operation <= 4) {
+ screenRef = obj->dictLookupNF("AN");
+ if (!screenRef.isRef() && operation >= 0 && operation <= 4) {
error(errSyntaxWarning, -1, "Invalid Rendition Action: no AN field with op = {0:d}", operationCode);
- screenRef.free();
+ screenRef.setToNull();
}
}
@@ -757,18 +719,12 @@
} else if (!js) {
error(errSyntaxWarning, -1, "Invalid Rendition action: no OP or JS field defined");
}
- tmp.free();
}
}
LinkRendition::~LinkRendition() {
- renditionObj.free();
- screenRef.free();
-
- if (js)
- delete js;
- if (media)
- delete media;
+ delete js;
+ delete media;
}
@@ -799,18 +755,15 @@
// LinkOCGState
//------------------------------------------------------------------------
LinkOCGState::LinkOCGState(Object *obj) {
- Object obj1;
-
stateList = new GooList();
preserveRB = gTrue;
- if (obj->dictLookup("State", &obj1)->isArray()) {
+ Object obj1 = obj->dictLookup("State");
+ if (obj1.isArray()) {
StateList *stList = NULL;
for (int i = 0; i < obj1.arrayGetLength(); ++i) {
- Object obj2;
-
- obj1.arrayGetNF(i, &obj2);
+ Object obj2 = obj1.arrayGetNF(i);
if (obj2.isName()) {
if (stList)
stateList->append(stList);
@@ -842,7 +795,6 @@
} else {
error(errSyntaxWarning, -1, "Invalid item in OCG Action State array");
}
- obj2.free();
}
// Add the last group
if (stList)
@@ -852,12 +804,11 @@
delete stateList;
stateList = NULL;
}
- obj1.free();
- if (obj->dictLookup("PreserveRB", &obj1)->isBool()) {
+ obj1 = obj->dictLookup("PreserveRB");
+ if (obj1.isBool()) {
preserveRB = obj1.getBool();
}
- obj1.free();
}
LinkOCGState::~LinkOCGState() {
diff --git a/poppler/Movie.cc b/poppler/Movie.cc
index f68b6ad..fa709b3 100644
--- a/poppler/Movie.cc
+++ b/poppler/Movie.cc
@@ -6,7 +6,7 @@
// Hugo Mercier <hmercier31[at]gmail.com> (c) 2008
// Pino Toscano <pino@kde.org> (c) 2008
// Carlos Garcia Campos <carlosgc@gnome.org> (c) 2010
-// Albert Astals Cid <aacid@kde.org> (c) 2010
+// Albert Astals Cid <aacid@kde.org> (c) 2010, 2017
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -47,9 +47,8 @@
}
void MovieActivationParameters::parseMovieActivation(Object* aDict) {
- Object obj1;
-
- if (!aDict->dictLookup("Start", &obj1)->isNull()) {
+ Object obj1 = aDict->dictLookup("Start");
+ if (obj1.isNull()) {
if (obj1.isInt()) {
// If it is representable as an integer (subject to the implementation limit for
// integers, as described in Appendix C), it should be specified as such.
@@ -64,26 +63,23 @@
} else if (obj1.isArray()) {
Array* a = obj1.getArray();
- Object tmp;
- a->get(0, &tmp);
+ Object tmp = a->get(0);
if (tmp.isInt()) {
start.units = tmp.getInt();
}
if (tmp.isString()) {
// UNSUPPORTED
}
- tmp.free();
- a->get(1, &tmp);
+ tmp = a->get(1);
if (tmp.isInt()) {
start.units_per_second = tmp.getInt();
}
- tmp.free();
}
}
- obj1.free();
- if (!aDict->dictLookup("Duration", &obj1)->isNull()) {
+ obj1 = aDict->dictLookup("Duration");
+ if (obj1.isNull()) {
if (obj1.isInt()) {
duration.units = obj1.getInt();
} else if (obj1.isString()) {
@@ -91,47 +87,44 @@
} else if (obj1.isArray()) {
Array* a = obj1.getArray();
- Object tmp;
- a->get(0, &tmp);
+ Object tmp = a->get(0);
if (tmp.isInt()) {
duration.units = tmp.getInt();
}
if (tmp.isString()) {
// UNSUPPORTED
}
- tmp.free();
- a->get(1, &tmp);
+ tmp = a->get(1);
if (tmp.isInt()) {
duration.units_per_second = tmp.getInt();
}
- tmp.free();
}
}
- obj1.free();
- if (aDict->dictLookup("Rate", &obj1)->isNum()) {
+ obj1 = aDict->dictLookup("Rate");
+ if (obj1.isNum()) {
rate = obj1.getNum();
}
- obj1.free();
- if (aDict->dictLookup("Volume", &obj1)->isNum()) {
+ obj1 = aDict->dictLookup("Volume");
+ if (obj1.isNum()) {
// convert volume to [0 100]
volume = int((obj1.getNum() + 1.0) * 50);
}
- obj1.free();
- if (aDict->dictLookup("ShowControls", &obj1)->isBool()) {
+ obj1 = aDict->dictLookup("ShowControls");
+ if (obj1.isBool()) {
showControls = obj1.getBool();
}
- obj1.free();
- if (aDict->dictLookup("Synchronous", &obj1)->isBool()) {
+ obj1 = aDict->dictLookup("Synchronous");
+ if (obj1.isBool()) {
synchronousPlay = obj1.getBool();
}
- obj1.free();
- if (aDict->dictLookup("Mode", &obj1)->isName()) {
+ obj1 = aDict->dictLookup("Mode");
+ if (obj1.isName()) {
char* name = obj1.getName();
if (!strcmp(name, "Once")) {
repeatMode = repeatModeOnce;
@@ -143,43 +136,40 @@
repeatMode = repeatModePalindrome;
}
}
- obj1.free();
- if (aDict->dictLookup("FWScale", &obj1)->isArray()) {
+ obj1 = aDict->dictLookup("FWScale");
+ if (obj1.isArray()) {
// the presence of that entry implies that the movie is to be played
// in a floating window
floatingWindow = gTrue;
Array* scale = obj1.getArray();
if (scale->getLength() >= 2) {
- Object tmp;
- if (scale->get(0, &tmp)->isInt()) {
+ Object tmp = scale->get(1);
+ if (tmp.isInt()) {
znum = tmp.getInt();
}
- tmp.free();
- if (scale->get(1, &tmp)->isInt()) {
+ tmp = scale->get(1);
+ if (tmp.isInt()) {
zdenum = tmp.getInt();
}
- tmp.free();
}
}
- obj1.free();
- if (aDict->dictLookup("FWPosition", &obj1)->isArray()) {
+ obj1 = aDict->dictLookup("FWPosition");
+ if (obj1.isArray()) {
Array* pos = obj1.getArray();
if (pos->getLength() >= 2) {
- Object tmp;
- if (pos->get(0, &tmp)->isNum()) {
+ Object tmp = pos->get(0);
+ if (tmp.isNum()) {
xPosition = tmp.getNum();
}
- tmp.free();
- if (pos->get(1, &tmp)->isNum()) {
+ tmp = pos->get(1);
+ if (tmp.isNum()) {
yPosition = tmp.getNum();
}
- tmp.free();
}
}
- obj1.free();
}
void Movie::parseMovie (Object *movieDict) {
@@ -189,59 +179,55 @@
height = -1;
showPoster = gFalse;
- Object obj1, obj2;
- if (getFileSpecNameForPlatform(movieDict->dictLookup("F", &obj1), &obj2)) {
+ Object obj1 = movieDict->dictLookup("F");
+ Object obj2 = getFileSpecNameForPlatform(&obj1);
+ if (obj2.isString()) {
fileName = obj2.getString()->copy();
- obj2.free();
} else {
error (errSyntaxError, -1, "Invalid Movie");
ok = gFalse;
- obj1.free();
return;
}
- obj1.free();
- if (movieDict->dictLookup("Aspect", &obj1)->isArray()) {
+ obj1 = movieDict->dictLookup("Aspect");
+ if (obj1.isArray()) {
Array* aspect = obj1.getArray();
if (aspect->getLength() >= 2) {
- Object tmp;
- if( aspect->get(0, &tmp)->isNum() ) {
- width = (int)floor( aspect->get(0, &tmp)->getNum() + 0.5 );
+ Object tmp = aspect->get(0);
+ if( tmp.isNum() ) {
+ width = (int)floor( tmp.getNum() + 0.5 );
}
- tmp.free();
- if( aspect->get(1, &tmp)->isNum() ) {
- height = (int)floor( aspect->get(1, &tmp)->getNum() + 0.5 );
+ tmp = aspect->get(1);
+ if( tmp.isNum() ) {
+ height = (int)floor( tmp.getNum() + 0.5 );
}
- tmp.free();
}
}
- obj1.free();
- if (movieDict->dictLookup("Rotate", &obj1)->isInt()) {
+ obj1 = movieDict->dictLookup("Rotate");
+ if (obj1.isInt()) {
// round up to 90°
rotationAngle = (((obj1.getInt() + 360) % 360) % 90) * 90;
}
- obj1.free();
//
// movie poster
//
- if (!movieDict->dictLookupNF("Poster", &poster)->isNull()) {
+ poster = movieDict->dictLookupNF("Poster");
+ if (!poster.isNull()) {
if (poster.isRef() || poster.isStream()) {
showPoster = gTrue;
} else if (poster.isBool()) {
showPoster = poster.getBool();
- poster.free();
+ poster.setToNull();
} else {
- poster.free();
+ poster.setToNull();
}
}
}
Movie::~Movie() {
- if (fileName)
- delete fileName;
- poster.free();
+ delete fileName;
}
Movie::Movie(Object *movieDict) {
@@ -265,6 +251,23 @@
}
}
+Movie::Movie(const Movie &other)
+{
+ ok = other.ok;
+ rotationAngle = other.rotationAngle;
+ width = other.width;
+ height = other.height;
+ showPoster = other.showPoster;
+ MA = other.MA;
+
+ poster = other.poster.copy();
+
+ if (other.fileName)
+ fileName = other.fileName->copy();
+ else
+ fileName = nullptr;
+}
+
void Movie::getFloatingWindowSize(int *widthA, int *heightA)
{
*widthA = int(width * double(MA.znum) / MA.zdenum);
@@ -272,14 +275,5 @@
}
Movie* Movie::copy() {
-
- // call default copy constructor
- Movie* new_movie = new Movie(*this);
-
- if (fileName)
- new_movie->fileName = fileName->copy();
-
- poster.copy(&new_movie->poster);
-
- return new_movie;
+ return new Movie(*this);
}
diff --git a/poppler/Movie.h b/poppler/Movie.h
index 1a16265..c0fcd8f 100644
--- a/poppler/Movie.h
+++ b/poppler/Movie.h
@@ -5,6 +5,7 @@
//---------------------------------------------------------------------------------
// Hugo Mercier <hmercier31[at]gmail.com> (c) 2008
// Carlos Garcia Campos <carlosgc@gnome.org> (c) 2010
+// Albert Astals Cid <aacid@kde.org> (c) 2017
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -71,6 +72,7 @@
public:
Movie(Object *objMovie, Object *objAct);
Movie(Object *objMovie);
+ Movie(const Movie &movie);
~Movie();
GBool isOk() { return ok; }
@@ -81,7 +83,7 @@
Gushort getRotationAngle() { return rotationAngle; }
void getAspect (int *widthA, int *heightA) { *widthA = width; *heightA = height; }
- Object *getPoster(Object *obj) { return poster.copy(obj); }
+ Object getPoster() { return poster.copy(); }
GBool getShowPoster() { return showPoster; }
GBool getUseFloatingWindow() { return MA.floatingWindow; }
diff --git a/poppler/Object.cc b/poppler/Object.cc
index d06bb39..4fce012 100644
--- a/poppler/Object.cc
+++ b/poppler/Object.cc
@@ -13,7 +13,7 @@
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
-// Copyright (C) 2008, 2010, 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008, 2010, 2012, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com>
//
// To see a description of the changes please see the Changelog file that
@@ -54,47 +54,48 @@
"error",
"eof",
"none",
- "integer64"
+ "integer64",
+ "dead"
};
#ifdef DEBUG_MEM
int Object::numAlloc[numObjTypes] =
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
#endif
-Object *Object::initArray(XRef *xref) {
- initObj(objArray);
- array = new Array(xref);
- return this;
+Object::Object(Object&& other)
+{
+ type = other.type;
+ real = other.real; // this is the biggest of the union so it's enough
+ other.type = objDead;
}
-Object *Object::initDict(XRef *xref) {
- initObj(objDict);
- dict = new Dict(xref);
- return this;
+Object& Object::operator=(Object&& other)
+{
+ free();
+ type = other.type;
+ real = other.real; // this is the biggest of the union so it's enough
+ other.type = objDead;
+ return *this;
}
-Object *Object::initDict(Dict *dictA) {
- initObj(objDict);
- dict = dictA;
- dict->incRef();
- return this;
+Object::~Object()
+{
+ free();
}
-Object *Object::initStream(Stream *streamA) {
- initObj(objStream);
- stream = streamA;
- return this;
-}
+Object Object::copy() const {
+ CHECK_NOT_DEAD;
-Object *Object::copy(Object *obj) {
- *obj = *this;
+ Object obj;
+ obj.type = type;
+ obj.real = real; // this is the biggest of the union so it's enough
switch (type) {
case objString:
- obj->string = string->copy();
+ obj.string = string->copy();
break;
case objName:
- obj->name = copyString(name);
+ obj.cString = copyString(cString);
break;
case objArray:
array->incRef();
@@ -106,7 +107,7 @@
stream->incRef();
break;
case objCmd:
- obj->cmd = copyString(cmd);
+ obj.cString = copyString(cString);
break;
default:
break;
@@ -117,9 +118,11 @@
return obj;
}
-Object *Object::fetch(XRef *xref, Object *obj, int recursion) {
+Object Object::fetch(XRef *xref, int recursion) const {
+ CHECK_NOT_DEAD;
+
return (type == objRef && xref) ?
- xref->fetch(ref.num, ref.gen, obj, recursion) : copy(obj);
+ xref->fetch(ref.num, ref.gen, recursion) : copy();
}
void Object::free() {
@@ -128,7 +131,7 @@
delete string;
break;
case objName:
- gfree(name);
+ gfree(cString);
break;
case objArray:
if (!array->decRef()) {
@@ -146,7 +149,7 @@
}
break;
case objCmd:
- gfree(cmd);
+ gfree(cString);
break;
default:
break;
@@ -181,7 +184,7 @@
fprintf(f, ")");
break;
case objName:
- fprintf(f, "/%s", name);
+ fprintf(f, "/%s", cString);
break;
case objNull:
fprintf(f, "null");
@@ -191,9 +194,8 @@
for (i = 0; i < arrayGetLength(); ++i) {
if (i > 0)
fprintf(f, " ");
- arrayGetNF(i, &obj);
+ obj = arrayGetNF(i);
obj.print(f);
- obj.free();
}
fprintf(f, "]");
break;
@@ -201,9 +203,8 @@
fprintf(f, "<<");
for (i = 0; i < dictGetLength(); ++i) {
fprintf(f, " /%s ", dictGetKey(i));
- dictGetValNF(i, &obj);
+ obj = dictGetValNF(i);
obj.print(f);
- obj.free();
}
fprintf(f, " >>");
break;
@@ -214,7 +215,7 @@
fprintf(f, "%d %d R", ref.num, ref.gen);
break;
case objCmd:
- fprintf(f, "%s", cmd);
+ fprintf(f, "%s", cString);
break;
case objError:
fprintf(f, "<error>");
@@ -225,6 +226,9 @@
case objNone:
fprintf(f, "<none>");
break;
+ case objDead:
+ fprintf(f, "<dead>");
+ break;
case objInt64:
fprintf(f, "%lld", int64g);
break;
diff --git a/poppler/Object.h b/poppler/Object.h
index 18c4558..23c98a9 100644
--- a/poppler/Object.h
+++ b/poppler/Object.h
@@ -65,6 +65,12 @@
abort(); \
}
+#define CHECK_NOT_DEAD \
+ if (unlikely(type == objDead)) { \
+ error(errInternal, 0, "Call to dead object"); \
+ abort(); \
+ }
+
class XRef;
class Array;
class Dict;
@@ -105,99 +111,105 @@
objNone, // uninitialized object
// poppler-only objects
- objInt64 // integer with at least 64-bits
+ objInt64, // integer with at least 64-bits
+ objDead // and object after shallowCopy
};
-#define numObjTypes 15 // total number of object types
+#define numObjTypes 16 // total number of object types
//------------------------------------------------------------------------
// Object
//------------------------------------------------------------------------
#ifdef DEBUG_MEM
-#define initObj(t) zeroUnion(); ++numAlloc[type = t]
+#define initObj(t) free(); zeroUnion(); ++numAlloc[type = t]
#else
-#define initObj(t) zeroUnion(); type = t
+#define initObj(t) free(); zeroUnion(); type = t
+#endif
+
+#ifdef DEBUG_MEM
+#define constructObj(t) ++numAlloc[type = t]
+#else
+#define constructObj(t) type = t
#endif
class Object {
public:
// clear the anonymous union as best we can -- clear at least a pointer
- void zeroUnion() { this->name = NULL; }
+ void zeroUnion() { this->cString = NULL; }
// Default constructor.
Object():
type(objNone) { zeroUnion(); }
+ ~Object();
- // Initialize an object.
- Object *initBool(GBool boolnA)
- { initObj(objBool); booln = boolnA; return this; }
- Object *initInt(int intgA)
- { initObj(objInt); intg = intgA; return this; }
- Object *initReal(double realA)
- { initObj(objReal); real = realA; return this; }
- Object *initString(GooString *stringA)
- { initObj(objString); string = stringA; return this; }
- Object *initName(const char *nameA)
- { initObj(objName); name = copyString(nameA); return this; }
- Object *initNull()
- { initObj(objNull); return this; }
- Object *initArray(XRef *xref);
- Object *initDict(XRef *xref);
- Object *initDict(Dict *dictA);
- Object *initStream(Stream *streamA);
- Object *initRef(int numA, int genA)
- { initObj(objRef); ref.num = numA; ref.gen = genA; return this; }
- Object *initCmd(char *cmdA)
- { initObj(objCmd); cmd = copyString(cmdA); return this; }
- Object *initError()
- { initObj(objError); return this; }
- Object *initEOF()
- { initObj(objEOF); return this; }
- Object *initInt64(long long int64gA)
- { initObj(objInt64); int64g = int64gA; return this; }
+ explicit Object(GBool boolnA)
+ { constructObj(objBool); booln = boolnA; }
+ explicit Object(int intgA)
+ { constructObj(objInt); intg = intgA; }
+ explicit Object(ObjType typeA)
+ { constructObj(typeA); }
+ explicit Object(double realA)
+ { constructObj(objReal); real = realA; }
+ explicit Object(GooString *stringA)
+ { constructObj(objString); string = stringA; }
+ Object(ObjType typeA, const char *stringA)
+ { constructObj(typeA); cString = copyString(stringA); }
+ explicit Object(long long int64gA)
+ { constructObj(objInt64); int64g = int64gA; }
+ explicit Object(Array *arrayA)
+ { constructObj(objArray); array = arrayA; }
+ explicit Object(Dict *dictA)
+ { constructObj(objDict); dict = dictA; }
+ explicit Object(Stream *streamA)
+ { constructObj(objStream); stream = streamA; }
+ Object(int numA, int genA)
+ { constructObj(objRef); ref.num = numA; ref.gen = genA; }
+ template<typename T> Object(T) = delete;
- // Copy an object.
- Object *copy(Object *obj);
- Object *shallowCopy(Object *obj) {
- *obj = *this;
- return obj;
- }
+ Object(Object&& other);
+ Object& operator=(Object&& other);
+
+ Object &operator=(const Object &other) = delete;
+ Object(const Object &other) = delete;
+
+ // Set object to null.
+ void setToNull() { initObj(objNull); }
+
+ // Copy this to obj
+ Object copy() const;
// If object is a Ref, fetch and return the referenced object.
// Otherwise, return a copy of the object.
- Object *fetch(XRef *xref, Object *obj, int recursion = 0);
-
- // Free object contents.
- void free();
+ Object fetch(XRef *xref, int recursion = 0) const;
// Type checking.
- ObjType getType() { return type; }
- GBool isBool() { return type == objBool; }
- GBool isInt() { return type == objInt; }
- GBool isReal() { return type == objReal; }
- GBool isNum() { return type == objInt || type == objReal || type == objInt64; }
- GBool isString() { return type == objString; }
- GBool isName() { return type == objName; }
- GBool isNull() { return type == objNull; }
- GBool isArray() { return type == objArray; }
- GBool isDict() { return type == objDict; }
- GBool isStream() { return type == objStream; }
- GBool isRef() { return type == objRef; }
- GBool isCmd() { return type == objCmd; }
- GBool isError() { return type == objError; }
- GBool isEOF() { return type == objEOF; }
- GBool isNone() { return type == objNone; }
- GBool isInt64() { return type == objInt64; }
- GBool isIntOrInt64() { return type == objInt || type == objInt64; }
+ ObjType getType() { CHECK_NOT_DEAD; return type; }
+ GBool isBool() { CHECK_NOT_DEAD; return type == objBool; }
+ GBool isInt() { CHECK_NOT_DEAD; return type == objInt; }
+ GBool isReal() { CHECK_NOT_DEAD; return type == objReal; }
+ GBool isNum() { CHECK_NOT_DEAD; return type == objInt || type == objReal || type == objInt64; }
+ GBool isString() { CHECK_NOT_DEAD; return type == objString; }
+ GBool isName() { CHECK_NOT_DEAD; return type == objName; }
+ GBool isNull() { CHECK_NOT_DEAD; return type == objNull; }
+ GBool isArray() { CHECK_NOT_DEAD; return type == objArray; }
+ GBool isDict() { CHECK_NOT_DEAD; return type == objDict; }
+ GBool isStream() { CHECK_NOT_DEAD; return type == objStream; }
+ GBool isRef() { CHECK_NOT_DEAD; return type == objRef; }
+ GBool isCmd() { CHECK_NOT_DEAD; return type == objCmd; }
+ GBool isError() { CHECK_NOT_DEAD; return type == objError; }
+ GBool isEOF() { CHECK_NOT_DEAD; return type == objEOF; }
+ GBool isNone() { CHECK_NOT_DEAD; return type == objNone; }
+ GBool isInt64() { CHECK_NOT_DEAD; return type == objInt64; }
+ GBool isIntOrInt64() { CHECK_NOT_DEAD; return type == objInt || type == objInt64; }
// Special type checking.
GBool isName(const char *nameA)
- { return type == objName && !strcmp(name, nameA); }
+ { return type == objName && !strcmp(cString, nameA); }
GBool isDict(const char *dictType);
GBool isStream(char *dictType);
GBool isCmd(const char *cmdA)
- { return type == objCmd && !strcmp(cmd, cmdA); }
+ { return type == objCmd && !strcmp(cString, cmdA); }
// Accessors.
GBool getBool() { OBJECT_TYPE_CHECK(objBool); return booln; }
@@ -220,36 +232,36 @@
// because the object it's not expected to have a NULL string.
GooString *takeString() {
OBJECT_TYPE_CHECK(objString); GooString *s = string; string = NULL; return s; }
- char *getName() { OBJECT_TYPE_CHECK(objName); return name; }
+ char *getName() { OBJECT_TYPE_CHECK(objName); return cString; }
Array *getArray() { OBJECT_TYPE_CHECK(objArray); return array; }
Dict *getDict() { OBJECT_TYPE_CHECK(objDict); return dict; }
Stream *getStream() { OBJECT_TYPE_CHECK(objStream); return stream; }
Ref getRef() { OBJECT_TYPE_CHECK(objRef); return ref; }
int getRefNum() { OBJECT_TYPE_CHECK(objRef); return ref.num; }
int getRefGen() { OBJECT_TYPE_CHECK(objRef); return ref.gen; }
- char *getCmd() { OBJECT_TYPE_CHECK(objCmd); return cmd; }
+ char *getCmd() { OBJECT_TYPE_CHECK(objCmd); return cString; }
long long getInt64() { OBJECT_TYPE_CHECK(objInt64); return int64g; }
long long getIntOrInt64() { OBJECT_2TYPES_CHECK(objInt, objInt64);
return type == objInt ? intg : int64g; }
// Array accessors.
int arrayGetLength();
- void arrayAdd(Object *elem);
+ void arrayAdd(Object &&elem);
void arrayRemove(int i);
- Object *arrayGet(int i, Object *obj, int recursion);
- Object *arrayGetNF(int i, Object *obj);
+ Object arrayGet(int i, int recursion);
+ Object arrayGetNF(int i);
// Dict accessors.
int dictGetLength();
- void dictAdd(char *key, Object *val);
- void dictSet(const char *key, Object *val);
+ void dictAdd(char *key, Object &&val);
+ void dictSet(const char *key, Object &&val);
void dictRemove(const char *key);
GBool dictIs(const char *dictType);
- Object *dictLookup(const char *key, Object *obj, int recursion = 0);
- Object *dictLookupNF(const char *key, Object *obj);
+ Object dictLookup(const char *key, int recursion = 0);
+ Object dictLookupNF(const char *key);
char *dictGetKey(int i);
- Object *dictGetVal(int i, Object *obj);
- Object *dictGetValNF(int i, Object *obj);
+ Object dictGetVal(int i);
+ Object dictGetValNF(int i);
// Stream accessors.
GBool streamIs(char *dictType);
@@ -271,6 +283,15 @@
static void memCheck(FILE *f);
private:
+ friend class Array; // Needs free and initNullAfterMalloc
+ friend class Dict; // Needs free and initNullAfterMalloc
+ friend class XRef; // Needs free and initNullAfterMalloc
+
+ // Free object contents.
+ void free();
+
+ // Only use if are mallocing Objects
+ void initNullAfterMalloc() { constructObj(objNull); }
ObjType type; // object type
union { // value for each type:
@@ -279,12 +300,11 @@
long long int64g; // 64-bit integer
double real; // real
GooString *string; // string
- char *name; // name
+ char *cString; // name or command, depending on objType
Array *array; // array
Dict *dict; // dictionary
Stream *stream; // stream
Ref ref; // indirect reference
- char *cmd; // command
};
#ifdef DEBUG_MEM
@@ -302,17 +322,17 @@
inline int Object::arrayGetLength()
{ OBJECT_TYPE_CHECK(objArray); return array->getLength(); }
-inline void Object::arrayAdd(Object *elem)
- { OBJECT_TYPE_CHECK(objArray); array->add(elem); }
+inline void Object::arrayAdd(Object &&elem)
+ { OBJECT_TYPE_CHECK(objArray); array->add(std::move(elem)); }
inline void Object::arrayRemove(int i)
{ OBJECT_TYPE_CHECK(objArray); array->remove(i); }
-inline Object *Object::arrayGet(int i, Object *obj, int recursion = 0)
- { OBJECT_TYPE_CHECK(objArray); return array->get(i, obj, recursion); }
+inline Object Object::arrayGet(int i, int recursion = 0)
+ { OBJECT_TYPE_CHECK(objArray); return array->get(i, recursion); }
-inline Object *Object::arrayGetNF(int i, Object *obj)
- { OBJECT_TYPE_CHECK(objArray); return array->getNF(i, obj); }
+inline Object Object::arrayGetNF(int i)
+ { OBJECT_TYPE_CHECK(objArray); return array->getNF(i); }
//------------------------------------------------------------------------
// Dict accessors.
@@ -323,11 +343,11 @@
inline int Object::dictGetLength()
{ OBJECT_TYPE_CHECK(objDict); return dict->getLength(); }
-inline void Object::dictAdd(char *key, Object *val)
- { OBJECT_TYPE_CHECK(objDict); dict->add(key, val); }
+inline void Object::dictAdd(char *key, Object &&val)
+ { OBJECT_TYPE_CHECK(objDict); dict->add(key, std::move(val)); }
-inline void Object::dictSet(const char *key, Object *val)
- { OBJECT_TYPE_CHECK(objDict); dict->set(key, val); }
+inline void Object::dictSet(const char *key, Object &&val)
+ { OBJECT_TYPE_CHECK(objDict); dict->set(key, std::move(val)); }
inline void Object::dictRemove(const char *key)
{ OBJECT_TYPE_CHECK(objDict); dict->remove(key); }
@@ -338,20 +358,20 @@
inline GBool Object::isDict(const char *dictType)
{ return type == objDict && dictIs(dictType); }
-inline Object *Object::dictLookup(const char *key, Object *obj, int recursion)
- { OBJECT_TYPE_CHECK(objDict); return dict->lookup(key, obj, recursion); }
+inline Object Object::dictLookup(const char *key, int recursion)
+ { OBJECT_TYPE_CHECK(objDict); return dict->lookup(key, recursion); }
-inline Object *Object::dictLookupNF(const char *key, Object *obj)
- { OBJECT_TYPE_CHECK(objDict); return dict->lookupNF(key, obj); }
+inline Object Object::dictLookupNF(const char *key)
+ { OBJECT_TYPE_CHECK(objDict); return dict->lookupNF(key); }
inline char *Object::dictGetKey(int i)
{ OBJECT_TYPE_CHECK(objDict); return dict->getKey(i); }
-inline Object *Object::dictGetVal(int i, Object *obj)
- { OBJECT_TYPE_CHECK(objDict); return dict->getVal(i, obj); }
+inline Object Object::dictGetVal(int i)
+ { OBJECT_TYPE_CHECK(objDict); return dict->getVal(i); }
-inline Object *Object::dictGetValNF(int i, Object *obj)
- { OBJECT_TYPE_CHECK(objDict); return dict->getValNF(i, obj); }
+inline Object Object::dictGetValNF(int i)
+ { OBJECT_TYPE_CHECK(objDict); return dict->getValNF(i); }
//------------------------------------------------------------------------
// Stream accessors.
diff --git a/poppler/OptionalContent.cc b/poppler/OptionalContent.cc
index 44eef19..d2e878e 100644
--- a/poppler/OptionalContent.cc
+++ b/poppler/OptionalContent.cc
@@ -43,50 +43,40 @@
optionalContentGroups = new GooList();
display = NULL;
- Object ocgList;
- ocgObject->dictLookup("OCGs", &ocgList);
+ Object ocgList = ocgObject->dictLookup("OCGs");
if (!ocgList.isArray()) {
error(errSyntaxError, -1, "Expected the optional content group list, but wasn't able to find it, or it isn't an Array");
- ocgList.free();
ok = gFalse;
return;
}
// we now enumerate over the ocgList, and build up the optionalContentGroups list.
for(int i = 0; i < ocgList.arrayGetLength(); ++i) {
- Object ocg;
- ocgList.arrayGet(i, &ocg);
+ Object ocg = ocgList.arrayGet(i);
if (!ocg.isDict()) {
- ocg.free();
break;
}
OptionalContentGroup *thisOptionalContentGroup = new OptionalContentGroup(ocg.getDict());
- ocg.free();
- ocgList.arrayGetNF(i, &ocg);
+ ocg = ocgList.arrayGetNF(i);
if (!ocg.isRef()) {
- ocg.free();
+ delete thisOptionalContentGroup;
break;
}
// TODO: we should create a lookup map from Ref to the OptionalContentGroup
thisOptionalContentGroup->setRef( ocg.getRef() );
- ocg.free();
// the default is ON - we change state later, depending on BaseState, ON and OFF
thisOptionalContentGroup->setState(OptionalContentGroup::On);
optionalContentGroups->append(thisOptionalContentGroup);
}
- Object defaultOcgConfig;
- ocgObject->dictLookup("D", &defaultOcgConfig);
+ Object defaultOcgConfig = ocgObject->dictLookup("D");
if (!defaultOcgConfig.isDict()) {
error(errSyntaxError, -1, "Expected the default config, but wasn't able to find it, or it isn't a Dictionary");
- defaultOcgConfig.free();
- ocgList.free();
ok = gFalse;
return;
}
- Object baseState;
- defaultOcgConfig.dictLookup("BaseState", &baseState);
+ Object baseState = defaultOcgConfig.dictLookup("BaseState");
if (baseState.isName("OFF")) {
for (int i = 0; i < optionalContentGroups->getLength(); ++i) {
OptionalContentGroup *group;
@@ -95,22 +85,17 @@
group->setState(OptionalContentGroup::Off);
}
}
- baseState.free();
- Object on;
- defaultOcgConfig.dictLookup("ON", &on);
+ Object on = defaultOcgConfig.dictLookup("ON");
if (on.isArray()) {
// ON is an optional element
for (int i = 0; i < on.arrayGetLength(); ++i) {
- Object reference;
- on.arrayGetNF(i, &reference);
+ Object reference = on.arrayGetNF(i);
if (!reference.isRef()) {
// there can be null entries
- reference.free();
break;
}
OptionalContentGroup *group = findOcgByRef( reference.getRef() );
- reference.free();
if (!group) {
error(errSyntaxWarning, -1, "Couldn't find group for reference");
break;
@@ -118,22 +103,17 @@
group->setState(OptionalContentGroup::On);
}
}
- on.free();
- Object off;
- defaultOcgConfig.dictLookup("OFF", &off);
+ Object off = defaultOcgConfig.dictLookup("OFF");
if (off.isArray()) {
// OFF is an optional element
for (int i = 0; i < off.arrayGetLength(); ++i) {
- Object reference;
- off.arrayGetNF(i, &reference);
+ Object reference = off.arrayGetNF(i);
if (!reference.isRef()) {
// there can be null entries
- reference.free();
break;
}
OptionalContentGroup *group = findOcgByRef( reference.getRef() );
- reference.free();
if (!group) {
error(errSyntaxWarning, -1, "Couldn't find group for reference to set OFF");
break;
@@ -141,22 +121,15 @@
group->setState(OptionalContentGroup::Off);
}
}
- off.free();
- defaultOcgConfig.dictLookup("Order", &order);
- defaultOcgConfig.dictLookup("RBGroups", &rbgroups);
-
- ocgList.free();
- defaultOcgConfig.free();
+ order = defaultOcgConfig.dictLookup("Order");
+ rbgroups = defaultOcgConfig.dictLookup("RBGroups");
}
OCGs::~OCGs()
{
deleteGooList(optionalContentGroups, OptionalContentGroup);
- order.free();
- if (display)
- delete display;
- rbgroups.free();
+ delete display;
}
@@ -193,12 +166,7 @@
bool OCGs::optContentIsVisible( Object *dictRef )
{
- Object dictObj;
Dict *dict;
- Object dictType;
- Object ocg;
- Object policy;
- Object ve;
bool result = true;
if (dictRef->isNull())
@@ -210,22 +178,22 @@
return oc->getState() == OptionalContentGroup::On;
}
- dictRef->fetch( m_xref, &dictObj );
+ Object dictObj = dictRef->fetch( m_xref);
if ( ! dictObj.isDict() ) {
error(errSyntaxWarning, -1, "Unexpected oc reference target: {0:d}", dictObj.getType() );
- dictObj.free();
return result;
}
dict = dictObj.getDict();
// printf("checking if optContent is visible\n");
- dict->lookup("Type", &dictType);
+ Object dictType = dict->lookup("Type");
if (dictType.isName("OCMD")) {
- if (dict->lookup("VE", &ve)->isArray()) {
+ Object ve = dict->lookup("VE");
+ if (ve.isArray()) {
result = evalOCVisibilityExpr(&ve, 0);
} else {
- dict->lookupNF("OCGs", &ocg);
+ Object ocg = dict->lookupNF("OCGs");
if (ocg.isArray()) {
- dict->lookup("P", &policy);
+ Object policy = dict->lookup("P");
if (policy.isName("AllOn")) {
result = allOn( ocg.getArray() );
} else if (policy.isName("AllOff")) {
@@ -236,7 +204,6 @@
// this is the default
result = anyOn( ocg.getArray() );
}
- policy.free();
} else if (ocg.isRef()) {
OptionalContentGroup *oc = findOcgByRef( ocg.getRef() );
if ( oc && oc->getState() == OptionalContentGroup::Off ) {
@@ -245,26 +212,20 @@
result = true ;
}
}
- ocg.free();
}
- ve.free();
} else if ( dictType.isName("OCG") ) {
OptionalContentGroup* oc = findOcgByRef( dictRef->getRef() );
if ( oc && oc->getState() == OptionalContentGroup::Off ) {
result=false;
}
}
- dictType.free();
- dictObj.free();
// printf("visibility: %s\n", result? "on" : "off");
return result;
}
GBool OCGs::evalOCVisibilityExpr(Object *expr, int recursion) {
OptionalContentGroup *ocg;
- Object expr2, op, obj;
GBool ret;
- int i;
if (recursion > visibilityExprRecursionLimit) {
error(errSyntaxError, -1,
@@ -276,19 +237,17 @@
return ocg->getState() == OptionalContentGroup::On;
}
}
- expr->fetch(m_xref, &expr2);
+ Object expr2 = expr->fetch(m_xref);
if (!expr2.isArray() || expr2.arrayGetLength() < 1) {
error(errSyntaxError, -1,
"Invalid optional content visibility expression");
- expr2.free();
return gTrue;
}
- expr2.arrayGet(0, &op);
+ Object op = expr2.arrayGet(0);
if (op.isName("Not")) {
if (expr2.arrayGetLength() == 2) {
- expr2.arrayGetNF(1, &obj);
+ Object obj = expr2.arrayGetNF(1);
ret = !evalOCVisibilityExpr(&obj, recursion + 1);
- obj.free();
} else {
error(errSyntaxError, -1,
"Invalid optional content visibility expression");
@@ -296,33 +255,28 @@
}
} else if (op.isName("And")) {
ret = gTrue;
- for (i = 1; i < expr2.arrayGetLength() && ret; ++i) {
- expr2.arrayGetNF(i, &obj);
+ for (int i = 1; i < expr2.arrayGetLength() && ret; ++i) {
+ Object obj = expr2.arrayGetNF(i);
ret = evalOCVisibilityExpr(&obj, recursion + 1);
- obj.free();
}
} else if (op.isName("Or")) {
ret = gFalse;
- for (i = 1; i < expr2.arrayGetLength() && !ret; ++i) {
- expr2.arrayGetNF(i, &obj);
+ for (int i = 1; i < expr2.arrayGetLength() && !ret; ++i) {
+ Object obj = expr2.arrayGetNF(i);
ret = evalOCVisibilityExpr(&obj, recursion + 1);
- obj.free();
}
} else {
error(errSyntaxError, -1,
"Invalid optional content visibility expression");
ret = gTrue;
}
- op.free();
- expr2.free();
return ret;
}
bool OCGs::allOn( Array *ocgArray )
{
for (int i = 0; i < ocgArray->getLength(); ++i) {
- Object ocgItem;
- ocgArray->getNF(i, &ocgItem);
+ Object ocgItem = ocgArray->getNF(i);
if (ocgItem.isRef()) {
OptionalContentGroup* oc = findOcgByRef( ocgItem.getRef() );
if ( oc && oc->getState() == OptionalContentGroup::Off ) {
@@ -336,8 +290,7 @@
bool OCGs::allOff( Array *ocgArray )
{
for (int i = 0; i < ocgArray->getLength(); ++i) {
- Object ocgItem;
- ocgArray->getNF(i, &ocgItem);
+ Object ocgItem = ocgArray->getNF(i);
if (ocgItem.isRef()) {
OptionalContentGroup* oc = findOcgByRef( ocgItem.getRef() );
if ( oc && oc->getState() == OptionalContentGroup::On ) {
@@ -351,8 +304,7 @@
bool OCGs::anyOn( Array *ocgArray )
{
for (int i = 0; i < ocgArray->getLength(); ++i) {
- Object ocgItem;
- ocgArray->getNF(i, &ocgItem);
+ Object ocgItem = ocgArray->getNF(i);
if (ocgItem.isRef()) {
OptionalContentGroup* oc = findOcgByRef( ocgItem.getRef() );
if ( oc && oc->getState() == OptionalContentGroup::On ) {
@@ -366,8 +318,7 @@
bool OCGs::anyOff( Array *ocgArray )
{
for (int i = 0; i < ocgArray->getLength(); ++i) {
- Object ocgItem;
- ocgArray->getNF(i, &ocgItem);
+ Object ocgItem = ocgArray->getNF(i);
if (ocgItem.isRef()) {
OptionalContentGroup* oc = findOcgByRef( ocgItem.getRef() );
if ( oc && oc->getState() == OptionalContentGroup::Off ) {
@@ -382,42 +333,39 @@
OptionalContentGroup::OptionalContentGroup(Dict *ocgDict) : m_name(NULL)
{
- Object obj1, obj2, obj3;
- Object ocgName;
- ocgDict->lookup("Name", &ocgName);
+ Object ocgName = ocgDict->lookup("Name");
if (!ocgName.isString()) {
error(errSyntaxWarning, -1, "Expected the name of the OCG, but wasn't able to find it, or it isn't a String");
} else {
m_name = new GooString( ocgName.getString() );
}
- ocgName.free();
viewState = printState = ocUsageUnset;
- if (ocgDict->lookup("Usage", &obj1)->isDict()) {
- if (obj1.dictLookup("View", &obj2)->isDict()) {
- if (obj2.dictLookup("ViewState", &obj3)->isName()) {
+ Object obj1 = ocgDict->lookup("Usage");
+ if (obj1.isDict()) {
+ Object obj2 = obj1.dictLookup("View");
+ if (obj2.isDict()) {
+ Object obj3 = obj2.dictLookup("ViewState");
+ if (obj3.isName()) {
if (obj3.isName("ON")) {
viewState = ocUsageOn;
} else {
viewState = ocUsageOff;
}
}
- obj3.free();
}
- obj2.free();
- if (obj1.dictLookup("Print", &obj2)->isDict()) {
- if (obj2.dictLookup("PrintState", &obj3)->isName()) {
+ obj2 = obj1.dictLookup("Print");
+ if (obj2.isDict()) {
+ Object obj3 = obj2.dictLookup("PrintState");
+ if (obj3.isName()) {
if (obj3.isName("ON")) {
printState = ocUsageOn;
} else {
printState = ocUsageOff;
}
}
- obj3.free();
}
- obj2.free();
}
- obj1.free();
}
OptionalContentGroup::OptionalContentGroup(GooString *label)
@@ -450,7 +398,6 @@
OCDisplayNode *OCDisplayNode::parse(Object *obj, OCGs *oc,
XRef *xref, int recursion) {
- Object obj2, obj3;
OptionalContentGroup *ocgA;
OCDisplayNode *node, *child;
int i;
@@ -464,25 +411,24 @@
return new OCDisplayNode(ocgA);
}
}
- obj->fetch(xref, &obj2);
+ Object obj2 = obj->fetch(xref);
if (!obj2.isArray()) {
- obj2.free();
return NULL;
}
i = 0;
if (obj2.arrayGetLength() >= 1) {
- if (obj2.arrayGet(0, &obj3)->isString()) {
+ Object obj3 = obj2.arrayGet(0);
+ if (obj3.isString()) {
node = new OCDisplayNode(obj3.getString());
i = 1;
} else {
node = new OCDisplayNode();
}
- obj3.free();
} else {
node = new OCDisplayNode();
}
for (; i < obj2.arrayGetLength(); ++i) {
- obj2.arrayGetNF(i, &obj3);
+ Object obj3 = obj2.arrayGetNF(i);
if ((child = OCDisplayNode::parse(&obj3, oc, xref, recursion + 1))) {
if (!child->ocg && !child->name && node->getNumChildren() > 0) {
node->getChild(node->getNumChildren() - 1)->addChildren(child->takeChildren());
@@ -491,9 +437,7 @@
node->addChild(child);
}
}
- obj3.free();
}
- obj2.free();
return node;
}
diff --git a/poppler/Outline.cc b/poppler/Outline.cc
index bf46be2..8d539ca 100644
--- a/poppler/Outline.cc
+++ b/poppler/Outline.cc
@@ -14,7 +14,7 @@
// under GPL version 2 or later
//
// Copyright (C) 2005 Marco Pesenti Gritti <mpg@redhat.com>
-// Copyright (C) 2008, 2016 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008, 2016, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2009 Nick Jones <nick.jones@network-box.com>
// Copyright (C) 2016 Jason Crain <jason@aquaticape.us>
//
@@ -41,15 +41,12 @@
//------------------------------------------------------------------------
Outline::Outline(Object *outlineObj, XRef *xref) {
- Object first, last;
-
- items = NULL;
+ items = nullptr;
if (!outlineObj->isDict()) {
return;
}
- items = OutlineItem::readItemList(outlineObj->dictLookupNF("First", &first), xref);
- first.free();
- last.free();
+ Object first = outlineObj->dictLookupNF("First");
+ items = OutlineItem::readItemList(&first, xref);
}
Outline::~Outline() {
@@ -62,42 +59,41 @@
OutlineItem::OutlineItem(Dict *dict, XRef *xrefA) {
Object obj1;
- GooString *s;
xref = xrefA;
title = NULL;
action = NULL;
kids = NULL;
- if (dict->lookup("Title", &obj1)->isString()) {
- s = obj1.getString();
+
+ if (obj1.isString()) {
+ GooString *s = obj1.getString();
titleLen = TextStringToUCS4(s, &title);
} else {
titleLen = 0;
}
- obj1.free();
- if (!dict->lookup("Dest", &obj1)->isNull()) {
+ obj1 = dict->lookup("Dest");
+ if (!obj1.isNull()) {
action = LinkAction::parseDest(&obj1);
} else {
- obj1.free();
- if (!dict->lookup("A", &obj1)->isNull()) {
- action = LinkAction::parseAction(&obj1);
+ obj1 = dict->lookup("A");
+ if (!obj1.isNull()) {
+ action = LinkAction::parseAction(&obj1);
+ }
}
- }
- obj1.free();
- dict->lookupNF("First", &firstRef);
- dict->lookupNF("Last", &lastRef);
- dict->lookupNF("Next", &nextRef);
+ firstRef = dict->lookupNF("First");
+ lastRef = dict->lookupNF("Last");
+ nextRef = dict->lookupNF("Next");
startsOpen = gFalse;
- if (dict->lookup("Count", &obj1)->isInt()) {
+ obj1 = dict->lookup("Count");
+ if (obj1.isInt()) {
if (obj1.getInt() > 0) {
startsOpen = gTrue;
}
}
- obj1.free();
}
OutlineItem::~OutlineItem() {
@@ -108,16 +104,12 @@
if (action) {
delete action;
}
- firstRef.free();
- lastRef.free();
- nextRef.free();
}
GooList *OutlineItem::readItemList(Object *firstItemRef, XRef *xrefA) {
GooList *items;
char* alreadyRead;
OutlineItem *item;
- Object obj;
Object *p;
items = new GooList();
@@ -130,13 +122,12 @@
(p->getRefNum() >= 0) &&
(p->getRefNum() < xrefA->getNumObjects()) &&
!alreadyRead[p->getRefNum()]) {
- if (!p->fetch(xrefA, &obj)->isDict()) {
- obj.free();
+ Object obj = p->fetch(xrefA);
+ if (!obj.isDict()) {
break;
}
alreadyRead[p->getRefNum()] = 1;
item = new OutlineItem(obj.getDict(), xrefA);
- obj.free();
items->append(item);
p = &item->nextRef;
}
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index ec5c700..35b3bc0 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -132,7 +132,6 @@
PDFDoc::PDFDoc(GooString *fileNameA, GooString *ownerPassword,
GooString *userPassword, void *guiDataA) {
- Object obj;
#ifdef _WIN32
int n, i;
#endif
@@ -163,8 +162,7 @@
}
// create stream
- obj.initNull();
- str = new FileStream(file, 0, gFalse, file->size(), &obj);
+ str = new FileStream(file, 0, gFalse, file->size(), Object(objNull));
ok = setup(ownerPassword, userPassword);
}
@@ -419,11 +417,10 @@
}
GBool PDFDoc::checkEncryption(GooString *ownerPassword, GooString *userPassword) {
- Object encrypt;
GBool encrypted;
GBool ret;
- xref->getTrailerDict()->dictLookup("Encrypt", &encrypt);
+ Object encrypt = xref->getTrailerDict()->dictLookup("Encrypt");
if ((encrypted = encrypt.isDict())) {
if ((secHdlr = SecurityHandler::make(this, &encrypt))) {
if (secHdlr->isUnencrypted()) {
@@ -451,7 +448,6 @@
// document is not encrypted
ret = gTrue;
}
- encrypt.free();
return ret;
}
@@ -565,7 +561,6 @@
return gFalse;
}
for (int page = 1; page <= linearization->getNumPages(); page++) {
- Object obj;
Ref pageRef;
pageRef.num = hints->getPageObjectNum(page);
@@ -581,13 +576,11 @@
}
pageRef.gen = xref->getEntry(pageRef.num)->gen;
- xref->fetch(pageRef.num, pageRef.gen, &obj);
+ Object obj = xref->fetch(pageRef.num, pageRef.gen);
if (!obj.isDict("Page")) {
- obj.free();
linearizationState = 2;
return gFalse;
}
- obj.free();
}
linearizationState = 1;
return gTrue;
@@ -607,10 +600,8 @@
void PDFDoc::setDocInfoModified(Object *infoObj)
{
- Object infoObjRef;
- getDocInfoNF(&infoObjRef);
+ Object infoObjRef = getDocInfoNF();
xref->setModifiedObject(infoObj, infoObjRef.getRef());
- infoObjRef.free();
}
void PDFDoc::setDocInfoStringEntry(const char *key, GooString *value)
@@ -620,25 +611,19 @@
delete value;
}
- Object infoObj;
- getDocInfo(&infoObj);
-
+ Object infoObj = getDocInfo();
if (infoObj.isNull() && removeEntry) {
// No info dictionary, so no entry to remove.
return;
}
- createDocInfoIfNoneExists(&infoObj);
-
- Object gooStrObj;
+ infoObj = createDocInfoIfNoneExists();
if (removeEntry) {
- gooStrObj.initNull();
+ infoObj.dictSet(key, Object(objNull));
} else {
- gooStrObj.initString(value);
+ infoObj.dictSet(key, Object(value));
}
- // gooStrObj is set to value or null by now. The latter will cause a removal.
- infoObj.dictSet(key, &gooStrObj);
if (infoObj.dictGetLength() == 0) {
// Info dictionary is empty. Remove it altogether.
@@ -646,19 +631,15 @@
} else {
setDocInfoModified(&infoObj);
}
-
- infoObj.free();
}
GooString *PDFDoc::getDocInfoStringEntry(const char *key) {
- Object infoObj;
- getDocInfo(&infoObj);
+ Object infoObj = getDocInfo();
if (!infoObj.isDict()) {
return NULL;
}
- Object entryObj;
- infoObj.dictLookup(key, &entryObj);
+ Object entryObj = infoObj.dictLookup(key);
GooString *result;
@@ -668,9 +649,6 @@
result = NULL;
}
- entryObj.free();
- infoObj.free();
-
return result;
}
@@ -696,45 +674,35 @@
}
GBool PDFDoc::getID(GooString *permanent_id, GooString *update_id) {
- Object obj;
- xref->getTrailerDict()->dictLookup ("ID", &obj);
+ Object obj = xref->getTrailerDict()->dictLookup ("ID");
if (obj.isArray() && obj.arrayGetLength() == 2) {
- Object obj2;
-
if (permanent_id) {
- if (obj.arrayGet(0, &obj2)->isString()) {
+ Object obj2 = obj.arrayGet(0);
+ if (obj2.isString()) {
if (!get_id (obj2.getString(), permanent_id)) {
- obj2.free();
return gFalse;
}
} else {
error(errSyntaxError, -1, "Invalid permanent ID");
- obj2.free();
return gFalse;
}
- obj2.free();
}
if (update_id) {
- if (obj.arrayGet(1, &obj2)->isString()) {
+ Object obj2 = obj.arrayGet(1);
+ if (obj2.isString()) {
if (!get_id (obj2.getString(), update_id)) {
- obj2.free();
return gFalse;
}
} else {
error(errSyntaxError, -1, "Invalid update ID");
- obj2.free();
return gFalse;
}
- obj2.free();
}
- obj.free();
-
return gTrue;
}
- obj.free();
return gFalse;
}
@@ -777,8 +745,7 @@
getCatalog()->getPage(pageNo)->getMediaBox(),
cropBox);
Ref *refPage = getCatalog()->getPageRef(pageNo);
- Object page;
- getXRef()->fetch(refPage->num, refPage->gen, &page);
+ Object page = getXRef()->fetch(refPage->num, refPage->gen);
if (!(f = fopen(name->getCString(), "wb"))) {
error(errIO, -1, "Couldn't open file '{0:t}'", name);
@@ -801,55 +768,48 @@
writeHeader(outStr, getPDFMajorVersion(), getPDFMinorVersion());
// get and mark info dict
- Object infoObj;
- getXRef()->getDocInfo(&infoObj);
+ Object infoObj = getXRef()->getDocInfo();
if (infoObj.isDict()) {
Dict *infoDict = infoObj.getDict();
markPageObjects(infoDict, yRef, countRef, 0, refPage->num, rootNum + 2);
if (trailerObj->isDict()) {
Dict *trailerDict = trailerObj->getDict();
- Object ref;
- trailerDict->lookupNF("Info", &ref);
+ Object ref = trailerDict->lookupNF("Info");
if (ref.isRef()) {
yRef->add(ref.getRef().num, ref.getRef().gen, 0, gTrue);
if (getXRef()->getEntry(ref.getRef().num)->type == xrefEntryCompressed) {
yRef->getEntry(ref.getRef().num)->type = xrefEntryCompressed;
}
}
- ref.free();
}
}
- infoObj.free();
// get and mark output intents etc.
- Object catObj, pagesObj, resourcesObj, annotsObj, afObj;
- getXRef()->getCatalog(&catObj);
+ Object catObj = getXRef()->getCatalog();
Dict *catDict = catObj.getDict();
- catDict->lookup("Pages", &pagesObj);
- catDict->lookupNF("AcroForm", &afObj);
+ Object pagesObj = catDict->lookup("Pages");
+ Object afObj = catDict->lookupNF("AcroForm");
if (!afObj.isNull()) {
markAcroForm(&afObj, yRef, countRef, 0, refPage->num, rootNum + 2);
- afObj.free();
}
Dict *pagesDict = pagesObj.getDict();
- pagesDict->lookup("Resources", &resourcesObj);
+ Object resourcesObj = pagesDict->lookup("Resources");
if (resourcesObj.isDict())
markPageObjects(resourcesObj.getDict(), yRef, countRef, 0, refPage->num, rootNum + 2);
markPageObjects(catDict, yRef, countRef, 0, refPage->num, rootNum + 2);
Dict *pageDict = page.getDict();
if (resourcesObj.isNull() && !pageDict->hasKey("Resources")) {
- Dict *resourceDict = getCatalog()->getPage(pageNo)->getResourceDict();
- if (resourceDict != NULL) {
- resourcesObj.initDict(resourceDict);
+ Object *resourceDictObject = getCatalog()->getPage(pageNo)->getResourceDictObject();
+ if (resourceDictObject->isDict()) {
+ resourcesObj = resourceDictObject->copy();
markPageObjects(resourcesObj.getDict(), yRef, countRef, 0, refPage->num, rootNum + 2);
}
}
markPageObjects(pageDict, yRef, countRef, 0, refPage->num, rootNum + 2);
- pageDict->lookupNF("Annots", &annotsObj);
+ Object annotsObj = pageDict->lookupNF("Annots");
if (!annotsObj.isNull()) {
markAnnotations(&annotsObj, yRef, countRef, 0, refPage->num, rootNum + 2);
- annotsObj.free();
}
yRef->markUnencrypted();
writePageObjects(outStr, yRef, 0);
@@ -864,14 +824,11 @@
strcmp(key, "Pages") != 0)
{
if (j > 0) outStr->printf(" ");
- Object value; catDict->getValNF(j, &value);
+ Object value = catDict->getValNF(j);
outStr->printf("/%s ", key);
writeObject(&value, outStr, getXRef(), 0, NULL, cryptRC4, 0, 0, 0);
- value.free();
}
}
- catObj.free();
- pagesObj.free();
outStr->printf(">>\nendobj\n");
yRef->add(rootNum + 1,0,outStr->getPos(),gTrue);
@@ -880,7 +837,6 @@
if (resourcesObj.isDict()) {
outStr->printf("/Resources ");
writeObject(&resourcesObj, outStr, getXRef(), 0, NULL, cryptRC4, 0, 0, 0);
- resourcesObj.free();
}
outStr->printf(">>\n");
outStr->printf("endobj\n");
@@ -891,27 +847,24 @@
for (int n = 0; n < pageDict->getLength(); n++) {
if (n > 0) outStr->printf(" ");
const char *key = pageDict->getKey(n);
- Object value; pageDict->getValNF(n, &value);
+ Object value = pageDict->getValNF(n);
if (strcmp(key, "Parent") == 0) {
outStr->printf("/Parent %d 0 R", rootNum + 1);
} else {
outStr->printf("/%s ", key);
writeObject(&value, outStr, getXRef(), 0, NULL, cryptRC4, 0, 0, 0);
}
- value.free();
}
outStr->printf(" >>\nendobj\n");
- page.free();
Goffset uxrefOffset = outStr->getPos();
Ref ref;
ref.num = rootNum;
ref.gen = 0;
- Dict *trailerDict = createTrailerDict(rootNum + 3, gFalse, 0, &ref, getXRef(),
+ Object trailerDict = createTrailerDict(rootNum + 3, gFalse, 0, &ref, getXRef(),
name->getCString(), uxrefOffset);
- writeXRefTableTrailer(trailerDict, yRef, gFalse /* do not write unnecessary entries */,
+ writeXRefTableTrailer(std::move(trailerDict), yRef, gFalse /* do not write unnecessary entries */,
uxrefOffset, outStr, getXRef());
- delete trailerDict;
outStr->close();
fclose(f);
@@ -1015,13 +968,11 @@
ref.num = i;
ref.gen = xref->getEntry(i)->type == xrefEntryCompressed ? 0 : xref->getEntry(i)->gen;
if (xref->getEntry(i)->type != xrefEntryFree) {
- Object obj1;
- xref->fetch(ref.num, ref.gen, &obj1, 1);
+ Object obj1 = xref->fetch(ref.num, ref.gen, 1);
Goffset offset = writeObjectHeader(&ref, outStr);
writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
writeObjectFooter(outStr);
uxref->add(ref.num, ref.gen, offset, gTrue);
- obj1.free();
} else {
uxref->add(ref.num, ref.gen, 0, gFalse);
}
@@ -1052,14 +1003,13 @@
uxref->add(uxrefStreamRef.num, uxrefStreamRef.gen, uxrefOffset, gTrue);
}
- Dict *trailerDict = createTrailerDict(numobjects, gTrue, getStartXRef(), &rootRef, getXRef(), fileNameA, uxrefOffset);
+ Object trailerDict = createTrailerDict(numobjects, gTrue, getStartXRef(), &rootRef, getXRef(), fileNameA, uxrefOffset);
if (xRefStream) {
- writeXRefStreamTrailer(trailerDict, uxref, &uxrefStreamRef, uxrefOffset, outStr, getXRef());
+ writeXRefStreamTrailer(std::move(trailerDict), uxref, &uxrefStreamRef, uxrefOffset, outStr, getXRef());
} else {
- writeXRefTableTrailer(trailerDict, uxref, gFalse, uxrefOffset, outStr, getXRef());
+ writeXRefTableTrailer(std::move(trailerDict), uxref, gFalse, uxrefOffset, outStr, getXRef());
}
- delete trailerDict;
delete uxref;
}
@@ -1079,7 +1029,6 @@
uxref->add(0, 65535, 0, gFalse);
xref->lock();
for(int i=0; i<xref->getNumObjects(); i++) {
- Object obj1;
Ref ref;
XRefEntryType type = xref->getEntry(i)->type;
if (type == xrefEntryFree) {
@@ -1097,7 +1046,7 @@
} else if (type == xrefEntryUncompressed){
ref.num = i;
ref.gen = xref->getEntry(i)->gen;
- xref->fetch(ref.num, ref.gen, &obj1, 1);
+ Object obj1 = xref->fetch(ref.num, ref.gen, 1);
Goffset offset = writeObjectHeader(&ref, outStr);
// Write unencrypted objects in unencrypted form
if (xref->getEntry(i)->getFlag(XRefEntry::Unencrypted)) {
@@ -1107,16 +1056,14 @@
}
writeObjectFooter(outStr);
uxref->add(ref.num, ref.gen, offset, gTrue);
- obj1.free();
} else if (type == xrefEntryCompressed) {
ref.num = i;
ref.gen = 0; //compressed entries have gen == 0
- xref->fetch(ref.num, ref.gen, &obj1, 1);
+ Object obj1 = xref->fetch(ref.num, ref.gen, 1);
Goffset offset = writeObjectHeader(&ref, outStr);
writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen);
writeObjectFooter(outStr);
uxref->add(ref.num, ref.gen, offset, gTrue);
- obj1.free();
}
}
xref->unlock();
@@ -1143,15 +1090,14 @@
alreadyWrittenDicts->insert(dict);
}
- Object obj1;
outStr->printf("<<");
for (int i=0; i<dict->getLength(); i++) {
GooString keyName(dict->getKey(i));
GooString *keyNameToPrint = keyName.sanitizedName(gFalse /* non ps mode */);
outStr->printf("/%s ", keyNameToPrint->getCString());
delete keyNameToPrint;
- writeObject(dict->getValNF(i, &obj1), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen, alreadyWrittenDicts);
- obj1.free();
+ Object obj1 = dict->getValNF(i);
+ writeObject(&obj1, outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen, alreadyWrittenDicts);
}
outStr->printf(">> ");
@@ -1172,8 +1118,7 @@
void PDFDoc::writeRawStream (Stream* str, OutStream* outStr)
{
- Object obj1;
- str->getDict()->lookup("Length", &obj1);
+ Object obj1 = str->getDict()->lookup("Length");
if (!obj1.isInt() && !obj1.isInt64()) {
error (errSyntaxError, -1, "PDFDoc::writeRawStream, no Length in stream dict");
return;
@@ -1184,7 +1129,6 @@
length = obj1.getInt();
else
length = obj1.getInt64();
- obj1.free();
outStr->printf("stream\r\n");
str->unfilteredReset();
@@ -1206,8 +1150,7 @@
// Encrypt string if encryption is enabled
GooString *sEnc = NULL;
if (fileKey) {
- Object obj;
- EncryptStream *enc = new EncryptStream(new MemStream(s->getCString(), 0, s->getLength(), obj.initNull()),
+ EncryptStream *enc = new EncryptStream(new MemStream(s->getCString(), 0, s->getLength(), Object(objNull)),
fileKey, encAlgorithm, keyLength, objNum, objGen);
sEnc = new GooString();
int c;
@@ -1267,8 +1210,6 @@
CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen, std::set<Dict*> *alreadyWrittenDicts)
{
Array *array;
- Object obj1;
- Goffset tmp;
switch (obj->getType()) {
case objBool:
@@ -1305,8 +1246,8 @@
array = obj->getArray();
outStr->printf("[");
for (int i=0; i<array->getLength(); i++) {
- writeObject(array->getNF(i, &obj1), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen);
- obj1.free();
+ Object obj1 = array->getNF(i);
+ writeObject(&obj1, outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen);
}
outStr->printf("] ");
break;
@@ -1325,19 +1266,15 @@
EncryptStream *encStream = NULL;
GBool removeFilter = gTrue;
if (stream->getKind() == strWeird && fileKey) {
- Object filter;
- stream->getDict()->lookup("Filter", &filter);
+ Object filter = stream->getDict()->lookup("Filter");
if (!filter.isName("Crypt")) {
if (filter.isArray()) {
for (int i = 0; i < filter.arrayGetLength(); i++) {
- Object filterEle;
- filter.arrayGet(i, &filterEle);
+ Object filterEle = filter.arrayGet(i);
if (filterEle.isName("Crypt")) {
- filterEle.free();
removeFilter = gFalse;
break;
}
- filterEle.free();
}
if (removeFilter) {
encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, objNum, objGen);
@@ -1352,7 +1289,6 @@
} else {
removeFilter = gFalse;
}
- filter.free();
} else if (fileKey != NULL) { // Encrypt stream
encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, objNum, objGen);
encStream->setAutoDelete(gFalse);
@@ -1361,12 +1297,11 @@
stream->reset();
//recalculate stream length
- tmp = 0;
+ Goffset tmp = 0;
for (int c=stream->getChar(); c!=EOF; c=stream->getChar()) {
tmp++;
}
- obj1.initInt64(tmp);
- stream->getDict()->set("Length", &obj1);
+ stream->getDict()->set("Length", Object(tmp));
//Remove Stream encoding
if (removeFilter) {
@@ -1377,7 +1312,6 @@
writeDictionnary (stream->getDict(),outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen, alreadyWrittenDicts);
writeStream (stream,outStr);
delete encStream;
- obj1.free();
} else {
//raw stream copy
FilterStream *fs = dynamic_cast<FilterStream*>(stream);
@@ -1386,9 +1320,8 @@
if (bs) {
Goffset streamEnd;
if (xRef->getStreamEnd(bs->getStart(), &streamEnd)) {
- Object val;
- val.initInt64(streamEnd - bs->getStart());
- stream->getDict()->set("Length", &val);
+ Goffset val = streamEnd - bs->getStart();
+ stream->getDict()->set("Length", Object(val));
}
}
}
@@ -1423,14 +1356,11 @@
outStr->printf("endobj\r\n");
}
-Dict *PDFDoc::createTrailerDict(int uxrefSize, GBool incrUpdate, Goffset startxRef,
+Object PDFDoc::createTrailerDict(int uxrefSize, GBool incrUpdate, Goffset startxRef,
Ref *root, XRef *xRef, const char *fileName, Goffset fileSize)
{
Dict *trailerDict = new Dict(xRef);
- Object obj1;
- obj1.initInt(uxrefSize);
- trailerDict->set("Size", &obj1);
- obj1.free();
+ trailerDict->set("Size", Object(uxrefSize));
//build a new ID, as recommended in the reference, uses:
// - current time
@@ -1449,105 +1379,90 @@
message.append(buffer);
//info dict -- only use text string
- if (!xRef->getTrailerDict()->isNone() && xRef->getDocInfo(&obj1)->isDict()) {
- for(int i=0; i<obj1.getDict()->getLength(); i++) {
- Object obj2;
- obj1.getDict()->getVal(i, &obj2);
+ Object docInfo = xRef->getDocInfo();
+ if (!xRef->getTrailerDict()->isNone() && docInfo.isDict()) {
+ for(int i=0; i<docInfo.getDict()->getLength(); i++) {
+ Object obj2 = docInfo.getDict()->getVal(i);
if (obj2.isString()) {
message.append(obj2.getString());
}
- obj2.free();
}
}
- obj1.free();
GBool hasEncrypt = gFalse;
if (!xRef->getTrailerDict()->isNone()) {
- Object obj2;
- xRef->getTrailerDict()->dictLookupNF("Encrypt", &obj2);
+ Object obj2 = xRef->getTrailerDict()->dictLookupNF("Encrypt");
if (!obj2.isNull()) {
- trailerDict->set("Encrypt", &obj2);
+ trailerDict->set("Encrypt", std::move(obj2));
hasEncrypt = gTrue;
- obj2.free();
}
}
//calculate md5 digest
Guchar digest[16];
md5((Guchar*)message.getCString(), message.getLength(), digest);
- obj1.initString(new GooString((const char*)digest, 16));
//create ID array
- Object obj2,obj3,obj5;
- obj2.initArray(xRef);
-
// In case of encrypted files, the ID must not be changed because it's used to calculate the key
if (incrUpdate || hasEncrypt) {
- Object obj4;
//only update the second part of the array
- xRef->getTrailerDict()->getDict()->lookup("ID", &obj4);
+ Object obj4 = xRef->getTrailerDict()->getDict()->lookup("ID");
if (!obj4.isArray()) {
error(errSyntaxWarning, -1, "PDFDoc::createTrailerDict original file's ID entry isn't an array. Trying to continue");
} else {
+ Array *array = new Array(xRef);
//Get the first part of the ID
- obj4.arrayGet(0,&obj3);
-
- obj2.arrayAdd(&obj3);
- obj2.arrayAdd(&obj1);
- trailerDict->set("ID", &obj2);
+ array->add(obj4.arrayGet(0));
+ array->add(Object(new GooString((const char*)digest, 16)));
+ trailerDict->set("ID", Object(array));
}
- obj4.free();
} else {
//new file => same values for the two identifiers
- obj2.arrayAdd(&obj1);
- obj1.initString(new GooString((const char*)digest, 16));
- obj2.arrayAdd(&obj1);
- trailerDict->set("ID", &obj2);
+ Array *array = new Array(xRef);
+ array->add(Object(new GooString((const char*)digest, 16)));
+ array->add(Object(new GooString((const char*)digest, 16)));
+ trailerDict->set("ID", Object(array));
}
- obj1.initRef(root->num, root->gen);
- trailerDict->set("Root", &obj1);
+ trailerDict->set("Root", Object(root->num, root->gen));
if (incrUpdate) {
- obj1.initInt64(startxRef);
- trailerDict->set("Prev", &obj1);
+ trailerDict->set("Prev", Object(startxRef));
}
if (!xRef->getTrailerDict()->isNone()) {
- xRef->getDocInfoNF(&obj5);
+ Object obj5 = xRef->getDocInfoNF();
if (!obj5.isNull()) {
- trailerDict->set("Info", &obj5);
+ trailerDict->set("Info", std::move(obj5));
}
}
- return trailerDict;
+ return Object(trailerDict);
}
-void PDFDoc::writeXRefTableTrailer(Dict *trailerDict, XRef *uxref, GBool writeAllEntries, Goffset uxrefOffset, OutStream* outStr, XRef *xRef)
+void PDFDoc::writeXRefTableTrailer(Object &&trailerDict, XRef *uxref, GBool writeAllEntries, Goffset uxrefOffset, OutStream* outStr, XRef *xRef)
{
uxref->writeTableToFile( outStr, writeAllEntries );
outStr->printf( "trailer\r\n");
- writeDictionnary(trailerDict, outStr, xRef, 0, NULL, cryptRC4, 0, 0, 0, nullptr);
+ writeDictionnary(trailerDict.getDict(), outStr, xRef, 0, NULL, cryptRC4, 0, 0, 0, nullptr);
outStr->printf( "\r\nstartxref\r\n");
outStr->printf( "%lli\r\n", uxrefOffset);
outStr->printf( "%%%%EOF\r\n");
}
-void PDFDoc::writeXRefStreamTrailer (Dict *trailerDict, XRef *uxref, Ref *uxrefStreamRef, Goffset uxrefOffset, OutStream* outStr, XRef *xRef)
+void PDFDoc::writeXRefStreamTrailer (Object &&trailerDict, XRef *uxref, Ref *uxrefStreamRef, Goffset uxrefOffset, OutStream* outStr, XRef *xRef)
{
GooString stmData;
// Fill stmData and some trailerDict fields
- uxref->writeStreamToBuffer(&stmData, trailerDict, xRef);
+ uxref->writeStreamToBuffer(&stmData, trailerDict.getDict(), xRef);
// Create XRef stream object and write it
- Object obj1;
- MemStream *mStream = new MemStream( stmData.getCString(), 0,
- stmData.getLength(), obj1.initDict(trailerDict) );
+ MemStream *mStream = new MemStream( stmData.getCString(), 0, stmData.getLength(), std::move(trailerDict) );
writeObjectHeader(uxrefStreamRef, outStr);
- writeObject(obj1.initStream(mStream), outStr, xRef, 0, NULL, cryptRC4, 0, 0, 0);
+ Object obj1(static_cast<Stream*>(mStream));
+ writeObject(&obj1, outStr, xRef, 0, NULL, cryptRC4, 0, 0, 0);
writeObjectFooter(outStr);
- obj1.free();
outStr->printf( "startxref\r\n");
outStr->printf( "%lli\r\n", uxrefOffset);
@@ -1569,10 +1484,9 @@
Ref ref;
ref.num = getXRef()->getRootNum();
ref.gen = getXRef()->getRootGen();
- Dict * trailerDict = createTrailerDict(uxrefSize, incrUpdate, getStartXRef(), &ref,
+ Object trailerDict = createTrailerDict(uxrefSize, incrUpdate, getStartXRef(), &ref,
getXRef(), fileNameA, fileSize);
- writeXRefTableTrailer(trailerDict, uxref, writeAllEntries, uxrefOffset, outStr, getXRef());
- delete trailerDict;
+ writeXRefTableTrailer(std::move(trailerDict), uxref, writeAllEntries, uxrefOffset, outStr, getXRef());
}
void PDFDoc::writeHeader(OutStream *outStr, int major, int minor)
@@ -1601,16 +1515,14 @@
for (int i=0; i<dict->getLength(); i++) {
const char *key = dict->getKey(i);
if (strcmp(key, "Annots") != 0) {
- markObject(dict->getValNF(i, &obj1), xRef, countRef, numOffset, oldRefNum, newRefNum, alreadyMarkedDicts);
+ Object obj1 = dict->getValNF(i);
+ markObject(&obj1, xRef, countRef, numOffset, oldRefNum, newRefNum, alreadyMarkedDicts);
} else {
- Object annotsObj;
- dict->getValNF(i, &annotsObj);
+ Object annotsObj = dict->getValNF(i);
if (!annotsObj.isNull()) {
markAnnotations(&annotsObj, xRef, countRef, 0, oldRefNum, newRefNum, alreadyMarkedDicts);
- annotsObj.free();
}
}
- obj1.free();
}
if (deleteSet) {
@@ -1621,14 +1533,13 @@
void PDFDoc::markObject (Object* obj, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum, std::set<Dict*> *alreadyMarkedDicts)
{
Array *array;
- Object obj1;
switch (obj->getType()) {
case objArray:
array = obj->getArray();
for (int i=0; i<array->getLength(); i++) {
- markObject(array->getNF(i, &obj1), xRef, countRef, numOffset, oldRefNum, newRefNum);
- obj1.free();
+ Object obj1 = array->getNF(i);
+ markObject(&obj1, xRef, countRef, numOffset, oldRefNum, newRefNum);
}
break;
case objDict:
@@ -1661,10 +1572,8 @@
if (entry->gen > 9)
break;
}
- Object obj1;
- getXRef()->fetch(obj->getRef().num, obj->getRef().gen, &obj1);
+ Object obj1 = getXRef()->fetch(obj->getRef().num, obj->getRef().gen);
markObject(&obj1, xRef, countRef, numOffset, oldRefNum, newRefNum);
- obj1.free();
}
break;
default:
@@ -1677,8 +1586,7 @@
PDFRectangle *cropBox)
{
Ref *refPage = getCatalog()->getPageRef(pageNo);
- Object page;
- getXRef()->fetch(refPage->num, refPage->gen, &page);
+ Object page = getXRef()->fetch(refPage->num, refPage->gen);
Dict *pageDict = page.getDict();
pageDict->remove("MediaBoxssdf");
pageDict->remove("MediaBox");
@@ -1687,48 +1595,27 @@
pageDict->remove("BleedBox");
pageDict->remove("TrimBox");
pageDict->remove("Rotate");
- Object mediaBoxObj;
- mediaBoxObj.initArray(getXRef());
- Object murx;
- murx.initReal(mediaBox->x1);
- Object mury;
- mury.initReal(mediaBox->y1);
- Object mllx;
- mllx.initReal(mediaBox->x2);
- Object mlly;
- mlly.initReal(mediaBox->y2);
- mediaBoxObj.arrayAdd(&murx);
- mediaBoxObj.arrayAdd(&mury);
- mediaBoxObj.arrayAdd(&mllx);
- mediaBoxObj.arrayAdd(&mlly);
- pageDict->add(copyString("MediaBox"), &mediaBoxObj);
+ Array *mediaBoxArray = new Array(getXRef());
+ mediaBoxArray->add(Object(mediaBox->x1));
+ mediaBoxArray->add(Object(mediaBox->y1));
+ mediaBoxArray->add(Object(mediaBox->x2));
+ mediaBoxArray->add(Object(mediaBox->y2));
+ Object mediaBoxObject(mediaBoxArray);
+ Object trimBoxObject = mediaBoxObject.copy();
+ pageDict->add(copyString("MediaBox"), std::move(mediaBoxObject));
if (cropBox != NULL) {
- Object cropBoxObj;
- cropBoxObj.initArray(getXRef());
- Object curx;
- curx.initReal(cropBox->x1);
- Object cury;
- cury.initReal(cropBox->y1);
- Object cllx;
- cllx.initReal(cropBox->x2);
- Object clly;
- clly.initReal(cropBox->y2);
- cropBoxObj.arrayAdd(&curx);
- cropBoxObj.arrayAdd(&cury);
- cropBoxObj.arrayAdd(&cllx);
- cropBoxObj.arrayAdd(&clly);
- pageDict->add(copyString("CropBox"), &cropBoxObj);
- cropBoxObj.getArray()->incRef();
- pageDict->add(copyString("TrimBox"), &cropBoxObj);
- } else {
- mediaBoxObj.getArray()->incRef();
- pageDict->add(copyString("TrimBox"), &mediaBoxObj);
+ Array *cropBoxArray = new Array(getXRef());
+ cropBoxArray->add(Object(cropBox->x1));
+ cropBoxArray->add(Object(cropBox->y1));
+ cropBoxArray->add(Object(cropBox->x2));
+ cropBoxArray->add(Object(cropBox->y2));
+ Object cropBoxObject(cropBoxArray);
+ trimBoxObject = cropBoxObject.copy();
+ pageDict->add(copyString("CropBox"), std::move(cropBoxObject));
}
- Object rotateObj;
- rotateObj.initInt(rotate);
- pageDict->add(copyString("Rotate"), &rotateObj);
+ pageDict->add(copyString("TrimBox"), std::move(trimBoxObject));
+ pageDict->add(copyString("Rotate"), Object(rotate));
getXRef()->setModifiedObject(&page, *refPage);
- page.free();
}
void PDFDoc::markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum, std::set<Dict*> *alreadyMarkedDicts)
@@ -1739,7 +1626,7 @@
for (int n = 0; n < pageDict->getLength(); n++) {
const char *key = pageDict->getKey(n);
- Object value; pageDict->getValNF(n, &value);
+ Object value = pageDict->getValNF(n);
if (strcmp(key, "Parent") != 0 &&
strcmp(key, "Pages") != 0 &&
strcmp(key, "AcroForm") != 0 &&
@@ -1748,73 +1635,48 @@
strcmp(key, "Root") != 0) {
markObject(&value, xRef, countRef, numOffset, oldRefNum, newRefNum, alreadyMarkedDicts);
}
- value.free();
}
}
GBool PDFDoc::markAnnotations(Object *annotsObj, XRef *xRef, XRef *countRef, Guint numOffset, int oldPageNum, int newPageNum, std::set<Dict*> *alreadyMarkedDicts) {
- Object annots;
GBool modified = gFalse;
- annotsObj->fetch(getXRef(), &annots);
+ Object annots = annotsObj->fetch(getXRef());
if (annots.isArray()) {
Array *array = annots.getArray();
for (int i=array->getLength() - 1; i >= 0; i--) {
- Object obj1;
- if (array->get(i, &obj1)->isDict()) {
- Object type;
+ Object obj1 = array->get(i);
+ if (obj1.isDict()) {
Dict *dict = obj1.getDict();
- dict->lookup("Type", &type);
+ Object type = dict->lookup("Type");
if (type.isName() && strcmp(type.getName(), "Annot") == 0) {
- Object obj2;
- if (dict->lookupNF("P", &obj2)->isRef()) {
+ Object obj2 = dict->lookupNF("P");
+ if (obj2.isRef()) {
if (obj2.getRef().num == oldPageNum) {
- Object obj3;
- array->getNF(i, &obj3);
+ Object obj3 = array->getNF(i);
if (obj3.isRef()) {
- Object newRef;
- newRef.initRef(newPageNum, 0);
- dict->set("P", &newRef);
+ dict->set("P", Object(newPageNum, 0));
getXRef()->setModifiedObject(&obj1, obj3.getRef());
}
- obj3.free();
} else if (obj2.getRef().num == newPageNum) {
- obj1.free();
- obj2.free();
- type.free();
continue;
} else {
- Object page;
- getXRef()->fetch(obj2.getRef().num, obj2.getRef().gen, &page);
+ Object page = getXRef()->fetch(obj2.getRef().num, obj2.getRef().gen);
if (page.isDict()) {
- Object pagetype;
Dict *dict = page.getDict();
- dict->lookup("Type", &pagetype);
+ Object pagetype = dict->lookup("Type");
if (!pagetype.isName() || strcmp(pagetype.getName(), "Page") != 0) {
- obj1.free();
- obj2.free();
- type.free();
- page.free();
- pagetype.free();
continue;
}
- pagetype.free();
}
- page.free();
- obj1.free();
- obj2.free();
- type.free();
array->remove(i);
modified = gTrue;
continue;
}
}
- obj2.free();
}
- type.free();
markPageObjects(dict, xRef, countRef, numOffset, oldPageNum, newPageNum, alreadyMarkedDicts);
}
- obj1.free();
- array->getNF(i, &obj1);
+ obj1 = array->getNF(i);
if (obj1.isRef()) {
if (obj1.getRef().num + (int) numOffset >= xRef->getNumObjects() || xRef->getEntry(obj1.getRef().num + numOffset)->type == xrefEntryFree) {
if (getXRef()->getEntry(obj1.getRef().num)->type == xrefEntryFree) {
@@ -1834,7 +1696,6 @@
entry->gen++;
}
}
- obj1.free();
}
}
if (annotsObj->isRef()) {
@@ -1857,25 +1718,21 @@
}
getXRef()->setModifiedObject(&annots, annotsObj->getRef());
}
- annots.free();
return modified;
}
void PDFDoc::markAcroForm(Object *afObj, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum) {
- Object acroform;
GBool modified = gFalse;
- afObj->fetch(getXRef(), &acroform);
+ Object acroform = afObj->fetch(getXRef());
if (acroform.isDict()) {
Dict *dict = acroform.getDict();
for (int i=0; i < dict->getLength(); i++) {
if (strcmp(dict->getKey(i), "Fields") == 0) {
- Object fields;
- modified = markAnnotations(dict->getValNF(i, &fields), xRef, countRef, numOffset, oldRefNum, newRefNum);
- fields.free();
+ Object fields = dict->getValNF(i);
+ modified = markAnnotations(&fields, xRef, countRef, numOffset, oldRefNum, newRefNum);
} else {
- Object obj;
- markObject(dict->getValNF(i, &obj), xRef, countRef, numOffset, oldRefNum, newRefNum);
- obj.free();
+ Object obj = dict->getValNF(i);
+ markObject(&obj, xRef, countRef, numOffset, oldRefNum, newRefNum);
}
}
}
@@ -1901,7 +1758,6 @@
getXRef()->setModifiedObject(&acroform, afObj->getRef());
}
}
- acroform.free();
return;
}
@@ -1915,12 +1771,11 @@
for (int n = numOffset; n < xRef->getNumObjects(); n++) {
if (xRef->getEntry(n)->type != xrefEntryFree) {
- Object obj;
Ref ref;
ref.num = n;
ref.gen = xRef->getEntry(n)->gen;
objectsCount++;
- getXRef()->fetch(ref.num - numOffset, ref.gen, &obj);
+ Object obj = getXRef()->fetch(ref.num - numOffset, ref.gen);
Goffset offset = writeObjectHeader(&ref, outStr);
if (combine) {
writeObject(&obj, outStr, getXRef(), numOffset, NULL, cryptRC4, 0, 0, 0);
@@ -1931,7 +1786,6 @@
}
writeObjectFooter(outStr);
xRef->add(ref.num, ref.gen, offset, gTrue);
- obj.free();
}
}
return objectsCount;
@@ -2068,10 +1922,7 @@
Page *PDFDoc::parsePage(int page)
{
- Page *p = NULL;
- Object obj;
Ref pageRef;
- Dict *pageDict;
pageRef.num = getHints()->getPageObjectNum(page);
if (!pageRef.num) {
@@ -2086,19 +1937,15 @@
}
pageRef.gen = xref->getEntry(pageRef.num)->gen;
- xref->fetch(pageRef.num, pageRef.gen, &obj);
+ Object obj = xref->fetch(pageRef.num, pageRef.gen);
if (!obj.isDict("Page")) {
- obj.free();
error(errSyntaxWarning, -1, "Object ({0:d} {1:d}) is not a pageDict", pageRef.num, pageRef.gen);
return NULL;
}
- pageDict = obj.getDict();
+ Dict *pageDict = obj.getDict();
- p = new Page(this, page, pageDict, pageRef,
+ return new Page(this, page, &obj, pageRef,
new PageAttrs(NULL, pageDict), catalog->getForm());
- obj.free();
-
- return p;
}
Page *PDFDoc::getPage(int page)
diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h
index c5621ec..83a2e97 100644
--- a/poppler/PDFDoc.h
+++ b/poppler/PDFDoc.h
@@ -229,12 +229,12 @@
GBool isLinearized(GBool tryingToReconstruct = gFalse);
// Return the document's Info dictionary (if any).
- Object *getDocInfo(Object *obj) { return xref->getDocInfo(obj); }
- Object *getDocInfoNF(Object *obj) { return xref->getDocInfoNF(obj); }
+ Object getDocInfo() { return xref->getDocInfo(); }
+ Object getDocInfoNF() { return xref->getDocInfoNF(); }
// Create and return the document's Info dictionary if none exists.
// Otherwise return the existing one.
- Object *createDocInfoIfNoneExists(Object *obj) { return xref->createDocInfoIfNoneExists(obj); }
+ Object createDocInfoIfNoneExists() { return xref->createDocInfoIfNoneExists(); }
// Remove the document's Info dictionary and update the trailer dictionary.
void removeDocInfo() { xref->removeDocInfo(); }
@@ -301,12 +301,11 @@
CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen, std::set<Dict*> *alreadyWrittenDicts = nullptr);
static void writeHeader(OutStream *outStr, int major, int minor);
- // Ownership goes to the caller
- static Dict *createTrailerDict (int uxrefSize, GBool incrUpdate, Goffset startxRef,
+ static Object createTrailerDict (int uxrefSize, GBool incrUpdate, Goffset startxRef,
Ref *root, XRef *xRef, const char *fileName, Goffset fileSize);
- static void writeXRefTableTrailer (Dict *trailerDict, XRef *uxref, GBool writeAllEntries,
+ static void writeXRefTableTrailer (Object &&trailerDict, XRef *uxref, GBool writeAllEntries,
Goffset uxrefOffset, OutStream* outStr, XRef *xRef);
- static void writeXRefStreamTrailer (Dict *trailerDict, XRef *uxref, Ref *uxrefStreamRef,
+ static void writeXRefStreamTrailer (Object &&trailerDict, XRef *uxref, Ref *uxrefStreamRef,
Goffset uxrefOffset, OutStream* outStr, XRef *xRef);
private:
diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc
index 0ff0bbb..b2d6d3a 100644
--- a/poppler/PSOutputDev.cc
+++ b/poppler/PSOutputDev.cc
@@ -15,7 +15,7 @@
//
// Copyright (C) 2005 Martin Kretzschmar <martink@gnome.org>
// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com>
-// Copyright (C) 2006-2009, 2011-2013, 2015, 2016 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006-2009, 2011-2013, 2015-2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2006 Jeff Muizelaar <jeff@infidigm.net>
// Copyright (C) 2007, 2008 Brad Hards <bradh@kde.org>
// Copyright (C) 2008, 2009 Koji Otani <sho@bbr.jp>
@@ -1533,7 +1533,6 @@
void PSOutputDev::writeHeader(const std::vector<int> &pages,
PDFRectangle *mediaBox, PDFRectangle *cropBox,
int pageRotate, char *psTitle) {
- Object info, obj1;
PSOutPaperSize *size;
double x1, y1, x2, y2;
int i;
@@ -1550,13 +1549,14 @@
break;
}
writePSFmt("%Produced by poppler pdftops version: {0:s} (http://poppler.freedesktop.org)\n", PACKAGE_VERSION);
- xref->getDocInfo(&info);
- if (info.isDict() && info.dictLookup("Creator", &obj1)->isString()) {
- writePS("%%Creator: ");
- writePSTextLine(obj1.getString());
+ Object info = xref->getDocInfo();
+ if (info.isDict()) {
+ Object obj1 = info.dictLookup("Creator");
+ if (obj1.isString()) {
+ writePS("%%Creator: ");
+ writePSTextLine(obj1.getString());
+ }
}
- obj1.free();
- info.free();
if(psTitle) {
char *sanitizedTitle = strdup(psTitle);
for (Guint i = 0; i < strlen(sanitizedTitle); ++i) {
@@ -1677,9 +1677,7 @@
Dict *resDict;
Annots *annots;
Object *acroForm;
- Object obj1, obj2, obj3;
GooString *s;
- int i;
if (mode == psModeForm) {
// swap the form and xpdf dicts
@@ -1698,30 +1696,30 @@
setupResources(resDict);
}
annots = page->getAnnots();
- for (i = 0; i < annots->getNumAnnots(); ++i) {
- if (annots->getAnnot(i)->getAppearanceResDict(&obj1)->isDict()) {
+ for (int i = 0; i < annots->getNumAnnots(); ++i) {
+ Object obj1 = annots->getAnnot(i)->getAppearanceResDict();
+ if (obj1.isDict()) {
setupResources(obj1.getDict());
}
- obj1.free();
}
}
if ((acroForm = catalog->getAcroForm()) && acroForm->isDict()) {
- if (acroForm->dictLookup("DR", &obj1)->isDict()) {
+ Object obj1 = acroForm->dictLookup("DR");
+ if (obj1.isDict()) {
setupResources(obj1.getDict());
}
- obj1.free();
- if (acroForm->dictLookup("Fields", &obj1)->isArray()) {
- for (i = 0; i < obj1.arrayGetLength(); ++i) {
- if (obj1.arrayGet(i, &obj2)->isDict()) {
- if (obj2.dictLookup("DR", &obj3)->isDict()) {
+ obj1 = acroForm->dictLookup("Fields");
+ if (obj1.isArray()) {
+ for (int i = 0; i < obj1.arrayGetLength(); ++i) {
+ Object obj2 = obj1.arrayGet(i);
+ if (obj2.isDict()) {
+ Object obj3 = obj2.dictLookup("DR");
+ if (obj3.isDict()) {
setupResources(obj3.getDict());
}
- obj3.free();
}
- obj2.free();
}
}
- obj1.free();
}
if (mode != psModeForm) {
if (mode != psModeEPS && !manualCtrl) {
@@ -1795,24 +1793,22 @@
}
void PSOutputDev::setupResources(Dict *resDict) {
- Object xObjDict, xObjRef, xObj, patDict, patRef, pat, resObj;
- Ref ref0;
GBool skip;
- int i;
setupFonts(resDict);
setupImages(resDict);
setupForms(resDict);
//----- recursively scan XObjects
- resDict->lookup("XObject", &xObjDict);
+ Object xObjDict = resDict->lookup("XObject");
if (xObjDict.isDict()) {
- for (i = 0; i < xObjDict.dictGetLength(); ++i) {
+ for (int i = 0; i < xObjDict.dictGetLength(); ++i) {
// avoid infinite recursion on XObjects
skip = gFalse;
- if ((xObjDict.dictGetValNF(i, &xObjRef)->isRef())) {
- ref0 = xObjRef.getRef();
+ Object xObjRef = xObjDict.dictGetValNF(i);
+ if (xObjRef.isRef()) {
+ Ref ref0 = xObjRef.getRef();
if (resourceIDs.find(ref0.num) != resourceIDs.end()) {
skip = gTrue;
} else {
@@ -1822,32 +1818,28 @@
if (!skip) {
// process the XObject's resource dictionary
- xObjDict.dictGetVal(i, &xObj);
+ Object xObj = xObjDict.dictGetVal(i);
if (xObj.isStream()) {
- xObj.streamGetDict()->lookup("Resources", &resObj);
+ Object resObj = xObj.streamGetDict()->lookup("Resources");
if (resObj.isDict()) {
setupResources(resObj.getDict());
}
- resObj.free();
}
- xObj.free();
}
-
- xObjRef.free();
}
}
- xObjDict.free();
//----- recursively scan Patterns
- resDict->lookup("Pattern", &patDict);
+ Object patDict = resDict->lookup("Pattern");
if (patDict.isDict()) {
inType3Char = gTrue;
- for (i = 0; i < patDict.dictGetLength(); ++i) {
+ for (int i = 0; i < patDict.dictGetLength(); ++i) {
// avoid infinite recursion on Patterns
skip = gFalse;
- if ((patDict.dictGetValNF(i, &patRef)->isRef())) {
- ref0 = patRef.getRef();
+ Object patRef = patDict.dictGetValNF(i);
+ if (patRef.isRef()) {
+ Ref ref0 = patRef.getRef();
if (resourceIDs.find(ref0.num) != resourceIDs.end()) {
skip = gTrue;
} else {
@@ -1857,40 +1849,33 @@
if (!skip) {
// process the Pattern's resource dictionary
- patDict.dictGetVal(i, &pat);
+ Object pat = patDict.dictGetVal(i);
if (pat.isStream()) {
- pat.streamGetDict()->lookup("Resources", &resObj);
+ Object resObj = pat.streamGetDict()->lookup("Resources");
if (resObj.isDict()) {
setupResources(resObj.getDict());
}
- resObj.free();
}
- pat.free();
}
-
- patRef.free();
}
inType3Char = gFalse;
}
- patDict.free();
}
void PSOutputDev::setupFonts(Dict *resDict) {
- Object obj1, obj2;
Ref r;
GfxFontDict *gfxFontDict;
GfxFont *font;
int i;
- gfxFontDict = NULL;
- resDict->lookupNF("Font", &obj1);
+ gfxFontDict = nullptr;
+ Object obj1 = resDict->lookupNF("Font");
if (obj1.isRef()) {
- obj1.fetch(xref, &obj2);
+ Object obj2 = obj1.fetch(xref);
if (obj2.isDict()) {
r = obj1.getRef();
gfxFontDict = new GfxFontDict(xref, &r, obj2.getDict());
}
- obj2.free();
} else if (obj1.isDict()) {
gfxFontDict = new GfxFontDict(xref, NULL, obj1.getDict());
}
@@ -1902,7 +1887,6 @@
}
delete gfxFontDict;
}
- obj1.free();
}
void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) {
@@ -2136,14 +2120,12 @@
void PSOutputDev::setupEmbeddedType1Font(Ref *id, GooString *psName) {
static const char hexChar[17] = "0123456789abcdef";
- Object refObj, strObj, obj1, obj2, obj3;
Dict *dict;
long length1, length2, length3;
- int c;
+ int c, i;
int start[4];
GBool binMode;
GBool writePadding = gTrue;
- int i;
// check if font is already embedded
if (fontNames->lookupInt(psName)) {
@@ -2152,9 +2134,9 @@
fontNames->add(psName->copy(), 1);
// get the font stream and info
- refObj.initRef(id->num, id->gen);
- refObj.fetch(xref, &strObj);
- refObj.free();
+ Object obj1, obj2, obj3;
+ Object refObj(id->num, id->gen);
+ Object strObj = refObj.fetch(xref);
if (!strObj.isStream()) {
error(errSyntaxError, -1, "Embedded font file object is not a stream");
goto err1;
@@ -2164,23 +2146,17 @@
"Embedded font stream is missing its dictionary");
goto err1;
}
- dict->lookup("Length1", &obj1);
- dict->lookup("Length2", &obj2);
- dict->lookup("Length3", &obj3);
+ obj1 = dict->lookup("Length1");
+ obj2 = dict->lookup("Length2");
+ obj3 = dict->lookup("Length3");
if (!obj1.isInt() || !obj2.isInt() || !obj3.isInt()) {
error(errSyntaxError, -1,
"Missing length fields in embedded font stream dictionary");
- obj1.free();
- obj2.free();
- obj3.free();
goto err1;
}
length1 = obj1.getInt();
length2 = obj2.getInt();
length3 = obj3.getInt();
- obj1.free();
- obj2.free();
- obj3.free();
// beginning comment
writePSFmt("%%BeginResource: font {0:t}\n", psName);
@@ -2324,7 +2300,6 @@
err1:
if (strObj.isStream())
strObj.streamClose();
- strObj.free();
}
void PSOutputDev::setupExternalType1Font(GooString *fileName, GooString *psName) {
@@ -2796,7 +2771,6 @@
Dict *parentResDict) {
Dict *resDict;
Dict *charProcs;
- Object charProc;
Gfx *gfx;
PDFRectangle box;
double *m;
@@ -2854,8 +2828,8 @@
writePS("/");
writePSName(charProcs->getKey(i));
writePS(" {\n");
- gfx->display(charProcs->getVal(i, &charProc));
- charProc.free();
+ Object charProc = charProcs->getVal(i);
+ gfx->display(&charProc);
if (t3String) {
if (t3Cacheable) {
buf = GooString::format("{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g} setcachedevice\n",
@@ -2922,25 +2896,24 @@
}
void PSOutputDev::setupImages(Dict *resDict) {
- Object xObjDict, xObj, xObjRef, subtypeObj, maskObj, maskRef;
Ref imgID;
- int i, j;
if (!(mode == psModeForm || inType3Char || preloadImagesForms)) {
return;
}
//----- recursively scan XObjects
- resDict->lookup("XObject", &xObjDict);
+ Object xObjDict = resDict->lookup("XObject");
if (xObjDict.isDict()) {
- for (i = 0; i < xObjDict.dictGetLength(); ++i) {
- xObjDict.dictGetValNF(i, &xObjRef);
- xObjDict.dictGetVal(i, &xObj);
+ for (int i = 0; i < xObjDict.dictGetLength(); ++i) {
+ Object xObjRef = xObjDict.dictGetValNF(i);
+ Object xObj = xObjDict.dictGetVal(i);
if (xObj.isStream()) {
- xObj.streamGetDict()->lookup("Subtype", &subtypeObj);
+ Object subtypeObj = xObj.streamGetDict()->lookup("Subtype");
if (subtypeObj.isName("Image")) {
if (xObjRef.isRef()) {
imgID = xObjRef.getRef();
+ int j;
for (j = 0; j < imgIDLen; ++j) {
if (imgIDs[j].num == imgID.num && imgIDs[j].gen == imgID.gen) {
break;
@@ -2957,24 +2930,21 @@
}
imgIDs[imgIDLen++] = imgID;
setupImage(imgID, xObj.getStream(), gFalse);
- if (level >= psLevel3 &&
- xObj.streamGetDict()->lookup("Mask", &maskObj)->isStream()) {
- setupImage(imgID, maskObj.getStream(), gTrue);
+ if (level >= psLevel3) {
+ Object maskObj = xObj.streamGetDict()->lookup("Mask");
+ if (maskObj.isStream()) {
+ setupImage(imgID, maskObj.getStream(), gTrue);
+ }
}
- maskObj.free();
}
} else {
error(errSyntaxError, -1,
"Image in resource dict is not an indirect reference");
}
}
- subtypeObj.free();
}
- xObj.free();
- xObjRef.free();
}
}
- xObjDict.free();
}
void PSOutputDev::setupImage(Ref id, Stream *str, GBool mask) {
@@ -3146,20 +3116,17 @@
}
void PSOutputDev::setupForms(Dict *resDict) {
- Object xObjDict, xObj, xObjRef, subtypeObj;
- int i;
-
if (!preloadImagesForms) {
return;
}
- resDict->lookup("XObject", &xObjDict);
+ Object xObjDict = resDict->lookup("XObject");
if (xObjDict.isDict()) {
- for (i = 0; i < xObjDict.dictGetLength(); ++i) {
- xObjDict.dictGetValNF(i, &xObjRef);
- xObjDict.dictGetVal(i, &xObj);
+ for (int i = 0; i < xObjDict.dictGetLength(); ++i) {
+ Object xObjRef = xObjDict.dictGetValNF(i);
+ Object xObj = xObjDict.dictGetVal(i);
if (xObj.isStream()) {
- xObj.streamGetDict()->lookup("Subtype", &subtypeObj);
+ Object subtypeObj = xObj.streamGetDict()->lookup("Subtype");
if (subtypeObj.isName("Form")) {
if (xObjRef.isRef()) {
setupForm(xObjRef.getRef(), &xObj);
@@ -3168,25 +3135,19 @@
"Form in resource dict is not an indirect reference");
}
}
- subtypeObj.free();
}
- xObj.free();
- xObjRef.free();
}
}
- xObjDict.free();
}
void PSOutputDev::setupForm(Ref id, Object *strObj) {
Dict *dict, *resDict;
- Object matrixObj, bboxObj, resObj, obj1;
double m[6], bbox[4];
PDFRectangle box;
Gfx *gfx;
- int i;
// check if form is already defined
- for (i = 0; i < formIDLen; ++i) {
+ for (int i = 0; i < formIDLen; ++i) {
if (formIDs[i].num == id.num && formIDs[i].gen == id.gen) {
return;
}
@@ -3206,36 +3167,31 @@
dict = strObj->streamGetDict();
// get bounding box
- dict->lookup("BBox", &bboxObj);
+ Object bboxObj = dict->lookup("BBox");
if (!bboxObj.isArray()) {
- bboxObj.free();
error(errSyntaxError, -1, "Bad form bounding box");
return;
}
- for (i = 0; i < 4; ++i) {
- bboxObj.arrayGet(i, &obj1);
+ for (int i = 0; i < 4; ++i) {
+ Object obj1 = bboxObj.arrayGet(i);
bbox[i] = obj1.getNum();
- obj1.free();
}
- bboxObj.free();
// get matrix
- dict->lookup("Matrix", &matrixObj);
+ Object matrixObj = dict->lookup("Matrix");
if (matrixObj.isArray()) {
- for (i = 0; i < 6; ++i) {
- matrixObj.arrayGet(i, &obj1);
+ for (int i = 0; i < 6; ++i) {
+ Object obj1 = matrixObj.arrayGet(i);
m[i] = obj1.getNum();
- obj1.free();
}
} else {
m[0] = 1; m[1] = 0;
m[2] = 0; m[3] = 1;
m[4] = 0; m[5] = 0;
}
- matrixObj.free();
// get resources
- dict->lookup("Resources", &resObj);
+ Object resObj = dict->lookup("Resources");
resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL;
writePSFmt("/f_{0:d}_{1:d} {{\n", id.num, id.gen);
@@ -3253,8 +3209,6 @@
writePS("Q\n");
writePS("} def\n");
-
- resObj.free();
}
GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/,
@@ -3276,7 +3230,6 @@
GfxState *state;
SplashBitmap *bitmap;
Stream *str0, *str;
- Object obj;
Guchar *p;
Guchar col[4];
double hDPI2, vDPI2;
@@ -3594,9 +3547,8 @@
case psLevel2Sep:
case psLevel3:
case psLevel3Sep:
- obj.initNull();
p = bitmap->getDataPtr() + (h - 1) * bitmap->getRowSize();
- str0 = new MemStream((char *)p, 0, w * h * numComps, &obj);
+ str0 = new MemStream((char *)p, 0, w * h * numComps, Object(objNull));
// Check for a color image that uses only gray
if (!getOptimizeColorSpace()) {
isGray = gFalse;
@@ -6880,138 +6832,111 @@
#if OPI_SUPPORT
void PSOutputDev::opiBegin(GfxState *state, Dict *opiDict) {
- Object dict;
-
if (generateOPI) {
- opiDict->lookup("2.0", &dict);
+ Object dict = opiDict->lookup("2.0");
if (dict.isDict()) {
opiBegin20(state, dict.getDict());
- dict.free();
} else {
- dict.free();
- opiDict->lookup("1.3", &dict);
+ dict = opiDict->lookup("1.3");
if (dict.isDict()) {
opiBegin13(state, dict.getDict());
}
- dict.free();
}
}
}
void PSOutputDev::opiBegin20(GfxState *state, Dict *dict) {
- Object obj1, obj2, obj3, obj4;
double width, height, left, right, top, bottom;
int w, h;
- int i;
writePS("%%BeginOPI: 2.0\n");
writePS("%%Distilled\n");
- dict->lookup("F", &obj1);
- if (getFileSpecName(&obj1, &obj2)) {
+ Object obj1 = dict->lookup("F");
+ Object obj2 = getFileSpecName(&obj1);
+ if (obj2.isString()) {
writePSFmt("%%ImageFileName: {0:t}\n", obj2.getString());
- obj2.free();
}
- obj1.free();
- dict->lookup("MainImage", &obj1);
+ obj1 = dict->lookup("MainImage");
if (obj1.isString()) {
writePSFmt("%%MainImage: {0:t}\n", obj1.getString());
}
- obj1.free();
//~ ignoring 'Tags' entry
//~ need to use writePSString() and deal with >255-char lines
- dict->lookup("Size", &obj1);
+ obj1 = dict->lookup("Size");
if (obj1.isArray() && obj1.arrayGetLength() == 2) {
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
width = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
height = obj2.getNum();
- obj2.free();
writePSFmt("%%ImageDimensions: {0:.6g} {1:.6g}\n", width, height);
}
- obj1.free();
- dict->lookup("CropRect", &obj1);
+ obj1 = dict->lookup("CropRect");
if (obj1.isArray() && obj1.arrayGetLength() == 4) {
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
left = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
top = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2, &obj2);
+ obj2 = obj1.arrayGet(2);
right = obj2.getNum();
- obj2.free();
- obj1.arrayGet(3, &obj2);
+ obj2 = obj1.arrayGet(3);
bottom = obj2.getNum();
- obj2.free();
writePSFmt("%%ImageCropRect: {0:.6g} {1:.6g} {2:.6g} {3:.6g}\n",
left, top, right, bottom);
}
- obj1.free();
- dict->lookup("Overprint", &obj1);
+ obj1 = dict->lookup("Overprint");
if (obj1.isBool()) {
writePSFmt("%%ImageOverprint: {0:s}\n", obj1.getBool() ? "true" : "false");
}
- obj1.free();
- dict->lookup("Inks", &obj1);
+ obj1 = dict->lookup("Inks");
if (obj1.isName()) {
writePSFmt("%%ImageInks: {0:s}\n", obj1.getName());
} else if (obj1.isArray() && obj1.arrayGetLength() >= 1) {
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
if (obj2.isName()) {
writePSFmt("%%ImageInks: {0:s} {1:d}",
obj2.getName(), (obj1.arrayGetLength() - 1) / 2);
- for (i = 1; i+1 < obj1.arrayGetLength(); i += 2) {
- obj1.arrayGet(i, &obj3);
- obj1.arrayGet(i+1, &obj4);
+ for (int i = 1; i+1 < obj1.arrayGetLength(); i += 2) {
+ Object obj3 = obj1.arrayGet(i);
+ Object obj4 = obj1.arrayGet(i+1);
if (obj3.isString() && obj4.isNum()) {
writePS(" ");
writePSString(obj3.getString());
writePSFmt(" {0:.6g}", obj4.getNum());
}
- obj3.free();
- obj4.free();
}
writePS("\n");
}
- obj2.free();
}
- obj1.free();
writePS("gsave\n");
writePS("%%BeginIncludedImage\n");
- dict->lookup("IncludedImageDimensions", &obj1);
+ obj1 = dict->lookup("IncludedImageDimensions");
if (obj1.isArray() && obj1.arrayGetLength() == 2) {
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
w = obj2.getInt();
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
h = obj2.getInt();
- obj2.free();
writePSFmt("%%IncludedImageDimensions: {0:d} {1:d}\n", w, h);
}
- obj1.free();
- dict->lookup("IncludedImageQuality", &obj1);
+ obj1 = dict->lookup("IncludedImageQuality");
if (obj1.isNum()) {
writePSFmt("%%IncludedImageQuality: {0:.6g}\n", obj1.getNum());
}
- obj1.free();
++opi20Nest;
}
void PSOutputDev::opiBegin13(GfxState *state, Dict *dict) {
- Object obj1, obj2;
int left, right, top, bottom, samples, bits, width, height;
double c, m, y, k;
double llx, lly, ulx, uly, urx, ury, lrx, lry;
@@ -7023,86 +6948,68 @@
writePS("/opiMatrix2 matrix currentmatrix def\n");
writePS("opiMatrix setmatrix\n");
- dict->lookup("F", &obj1);
- if (getFileSpecName(&obj1, &obj2)) {
+ Object obj1 = dict->lookup("F");
+ Object obj2 = getFileSpecName(&obj1);
+ if (obj2.isString()) {
writePSFmt("%ALDImageFileName: {0:t}\n", obj2.getString());
- obj2.free();
}
- obj1.free();
- dict->lookup("CropRect", &obj1);
+ obj1 = dict->lookup("CropRect");
if (obj1.isArray() && obj1.arrayGetLength() == 4) {
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
left = obj2.getInt();
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
top = obj2.getInt();
- obj2.free();
- obj1.arrayGet(2, &obj2);
+ obj2 = obj1.arrayGet(2);
right = obj2.getInt();
- obj2.free();
- obj1.arrayGet(3, &obj2);
+ obj2 = obj1.arrayGet(3);
bottom = obj2.getInt();
- obj2.free();
writePSFmt("%ALDImageCropRect: {0:d} {1:d} {2:d} {3:d}\n",
left, top, right, bottom);
}
- obj1.free();
- dict->lookup("Color", &obj1);
+ obj1 = dict->lookup("Color");
if (obj1.isArray() && obj1.arrayGetLength() == 5) {
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
c = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
m = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2, &obj2);
+ obj2 = obj1.arrayGet(2);
y = obj2.getNum();
- obj2.free();
- obj1.arrayGet(3, &obj2);
+ obj2 = obj1.arrayGet(3);
k = obj2.getNum();
- obj2.free();
- obj1.arrayGet(4, &obj2);
+ obj2 = obj1.arrayGet(4);
if (obj2.isString()) {
writePSFmt("%ALDImageColor: {0:.4g} {1:.4g} {2:.4g} {3:.4g} ",
c, m, y, k);
writePSString(obj2.getString());
writePS("\n");
}
- obj2.free();
}
- obj1.free();
- dict->lookup("ColorType", &obj1);
+ obj1 = dict->lookup("ColorType");
if (obj1.isName()) {
writePSFmt("%ALDImageColorType: {0:s}\n", obj1.getName());
}
- obj1.free();
//~ ignores 'Comments' entry
//~ need to handle multiple lines
- dict->lookup("CropFixed", &obj1);
+ obj1 = dict->lookup("CropFixed");
if (obj1.isArray()) {
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
ulx = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
uly = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2, &obj2);
+ obj2 = obj1.arrayGet(2);
lrx = obj2.getNum();
- obj2.free();
- obj1.arrayGet(3, &obj2);
+ obj2 = obj1.arrayGet(3);
lry = obj2.getNum();
- obj2.free();
writePSFmt("%ALDImageCropFixed: {0:.6g} {1:.6g} {2:.6g} {3:.6g}\n",
ulx, uly, lrx, lry);
}
- obj1.free();
- dict->lookup("GrayMap", &obj1);
+ obj1 = dict->lookup("GrayMap");
if (obj1.isArray()) {
writePS("%ALDImageGrayMap:");
for (i = 0; i < obj1.arrayGetLength(); i += 16) {
@@ -7110,116 +7017,90 @@
writePS("\n%%+");
}
for (j = 0; j < 16 && i+j < obj1.arrayGetLength(); ++j) {
- obj1.arrayGet(i+j, &obj2);
+ obj2 = obj1.arrayGet(i+j);
writePSFmt(" {0:d}", obj2.getInt());
- obj2.free();
}
}
writePS("\n");
}
- obj1.free();
- dict->lookup("ID", &obj1);
+ obj1 = dict->lookup("ID");
if (obj1.isString()) {
writePSFmt("%ALDImageID: {0:t}\n", obj1.getString());
}
- obj1.free();
- dict->lookup("ImageType", &obj1);
+ obj1 = dict->lookup("ImageType");
if (obj1.isArray() && obj1.arrayGetLength() == 2) {
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
samples = obj2.getInt();
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
bits = obj2.getInt();
- obj2.free();
writePSFmt("%ALDImageType: {0:d} {1:d}\n", samples, bits);
}
- obj1.free();
- dict->lookup("Overprint", &obj1);
+ dict->lookup("Overprint");
if (obj1.isBool()) {
writePSFmt("%ALDImageOverprint: {0:s}\n",
obj1.getBool() ? "true" : "false");
}
- obj1.free();
- dict->lookup("Position", &obj1);
+ obj1 = dict->lookup("Position");
if (obj1.isArray() && obj1.arrayGetLength() == 8) {
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
llx = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
lly = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2, &obj2);
+ obj2 = obj1.arrayGet(2);
ulx = obj2.getNum();
- obj2.free();
- obj1.arrayGet(3, &obj2);
+ obj2 = obj1.arrayGet(3);
uly = obj2.getNum();
- obj2.free();
- obj1.arrayGet(4, &obj2);
+ obj2 = obj1.arrayGet(4);
urx = obj2.getNum();
- obj2.free();
- obj1.arrayGet(5, &obj2);
+ obj2 = obj1.arrayGet(5);
ury = obj2.getNum();
- obj2.free();
- obj1.arrayGet(6, &obj2);
+ obj2 = obj1.arrayGet(6);
lrx = obj2.getNum();
- obj2.free();
- obj1.arrayGet(7, &obj2);
+ obj2 = obj1.arrayGet(7);
lry = obj2.getNum();
- obj2.free();
opiTransform(state, llx, lly, &tllx, &tlly);
opiTransform(state, ulx, uly, &tulx, &tuly);
opiTransform(state, urx, ury, &turx, &tury);
opiTransform(state, lrx, lry, &tlrx, &tlry);
writePSFmt("%ALDImagePosition: {0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g} {6:.6g} {7:.6g}\n",
tllx, tlly, tulx, tuly, turx, tury, tlrx, tlry);
- obj2.free();
}
- obj1.free();
- dict->lookup("Resolution", &obj1);
+ obj1 = dict->lookup("Resolution");
if (obj1.isArray() && obj1.arrayGetLength() == 2) {
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
horiz = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
vert = obj2.getNum();
- obj2.free();
writePSFmt("%ALDImageResoution: {0:.6g} {1:.6g}\n", horiz, vert);
- obj2.free();
}
- obj1.free();
- dict->lookup("Size", &obj1);
+ obj1 = dict->lookup("Size");
if (obj1.isArray() && obj1.arrayGetLength() == 2) {
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
width = obj2.getInt();
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
height = obj2.getInt();
- obj2.free();
writePSFmt("%ALDImageDimensions: {0:d} {1:d}\n", width, height);
}
- obj1.free();
//~ ignoring 'Tags' entry
//~ need to use writePSString() and deal with >255-char lines
- dict->lookup("Tint", &obj1);
+ obj1 = dict->lookup("Tint");
if (obj1.isNum()) {
writePSFmt("%ALDImageTint: {0:.6g}\n", obj1.getNum());
}
- obj1.free();
- dict->lookup("Transparency", &obj1);
+ obj1 = dict->lookup("Transparency");
if (obj1.isBool()) {
writePSFmt("%ALDImageTransparency: {0:s}\n",
obj1.getBool() ? "true" : "false");
}
- obj1.free();
writePS("%%BeginObject: image\n");
writePS("opiMatrix2 setmatrix\n");
@@ -7253,25 +7134,20 @@
}
void PSOutputDev::opiEnd(GfxState *state, Dict *opiDict) {
- Object dict;
-
if (generateOPI) {
- opiDict->lookup("2.0", &dict);
+ Object dict = opiDict->lookup("2.0");
if (dict.isDict()) {
writePS("%%EndIncludedImage\n");
writePS("%%EndOPI\n");
writePS("grestore\n");
--opi20Nest;
- dict.free();
} else {
- dict.free();
- opiDict->lookup("1.3", &dict);
+ dict = opiDict->lookup("1.3");
if (dict.isDict()) {
writePS("%%EndObject\n");
writePS("restore\n");
--opi13Nest;
}
- dict.free();
}
}
}
diff --git a/poppler/Page.cc b/poppler/Page.cc
index dca52e4..197e2be 100644
--- a/poppler/Page.cc
+++ b/poppler/Page.cc
@@ -15,7 +15,7 @@
//
// Copyright (C) 2005 Kristian Høgsberg <krh@redhat.com>
// Copyright (C) 2005 Jeff Muizelaar <jeff@infidigm.net>
-// Copyright (C) 2005-2013, 2016 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005-2013, 2016, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2006-2008 Pino Toscano <pino@kde.org>
// Copyright (C) 2006 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
// Copyright (C) 2006 Scott Turner <scotty1024@mac.com>
@@ -108,7 +108,7 @@
cropBox = attrs->cropBox;
haveCropBox = attrs->haveCropBox;
rotate = attrs->rotate;
- attrs->resources.copy(&resources);
+ resources = attrs->resources.copy();
} else {
// set default MediaBox to 8.5" x 11" -- this shouldn't be necessary
// but some (non-compliant) PDF files don't specify a MediaBox
@@ -119,7 +119,7 @@
cropBox.x1 = cropBox.y1 = cropBox.x2 = cropBox.y2 = 0;
haveCropBox = gFalse;
rotate = 0;
- resources.initNull();
+ resources.setToNull();
}
// media box
@@ -158,11 +158,10 @@
readBox(dict, "ArtBox", &artBox);
// rotate
- dict->lookup("Rotate", &obj1);
+ obj1 = dict->lookup("Rotate");
if (obj1.isInt()) {
rotate = obj1.getInt();
}
- obj1.free();
while (rotate < 0) {
rotate += 360;
}
@@ -171,30 +170,21 @@
}
// misc attributes
- dict->lookup("LastModified", &lastModified);
- dict->lookup("BoxColorInfo", &boxColorInfo);
- dict->lookup("Group", &group);
- dict->lookup("Metadata", &metadata);
- dict->lookup("PieceInfo", &pieceInfo);
- dict->lookup("SeparationInfo", &separationInfo);
+ lastModified = dict->lookup("LastModified");
+ boxColorInfo = dict->lookup("BoxColorInfo");
+ group = dict->lookup("Group");
+ metadata = dict->lookup("Metadata");
+ pieceInfo = dict->lookup("PieceInfo");
+ separationInfo = dict->lookup("SeparationInfo");
// resource dictionary
- dict->lookup("Resources", &obj1);
+ obj1 = dict->lookup("Resources");
if (obj1.isDict()) {
- resources.free();
- obj1.copy(&resources);
+ resources = obj1.copy();
}
- obj1.free();
}
PageAttrs::~PageAttrs() {
- lastModified.free();
- boxColorInfo.free();
- group.free();
- metadata.free();
- pieceInfo.free();
- separationInfo.free();
- resources.free();
}
void PageAttrs::clipBoxes() {
@@ -210,37 +200,33 @@
Object obj1, obj2;
GBool ok;
- dict->lookup(key, &obj1);
+ obj1 = dict->lookup(key);
if (obj1.isArray() && obj1.arrayGetLength() == 4) {
ok = gTrue;
- obj1.arrayGet(0, &obj2);
+ obj2 = obj1.arrayGet(0);
if (obj2.isNum()) {
tmp.x1 = obj2.getNum();
} else {
ok = gFalse;
}
- obj2.free();
- obj1.arrayGet(1, &obj2);
+ obj2 = obj1.arrayGet(1);
if (obj2.isNum()) {
tmp.y1 = obj2.getNum();
} else {
ok = gFalse;
}
- obj2.free();
- obj1.arrayGet(2, &obj2);
+ obj2 = obj1.arrayGet(2);
if (obj2.isNum()) {
tmp.x2 = obj2.getNum();
} else {
ok = gFalse;
}
- obj2.free();
- obj1.arrayGet(3, &obj2);
+ obj2 = obj1.arrayGet(3);
if (obj2.isNum()) {
tmp.y2 = obj2.getNum();
} else {
ok = gFalse;
}
- obj2.free();
if (tmp.x1 == 0 && tmp.x2 == 0 && tmp.y1 == 0 && tmp.y2 == 0)
ok = gFalse;
if (ok) {
@@ -255,7 +241,6 @@
} else {
ok = gFalse;
}
- obj1.free();
return ok;
}
@@ -263,9 +248,7 @@
// Page
//------------------------------------------------------------------------
-Page::Page(PDFDoc *docA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form) {
- Object tmp;
-
+Page::Page(PDFDoc *docA, int numA, Object *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form) {
#if MULTITHREADED
gInitMutex(&mutex);
#endif
@@ -276,7 +259,7 @@
duration = -1;
annots = NULL;
- pageObj.initDict(pageDict);
+ pageObj = pageDict->copy();
pageRef = pageRefA;
// get attributes
@@ -284,79 +267,67 @@
attrs->clipBoxes();
// transtion
- pageDict->lookupNF("Trans", &trans);
+ trans = pageDict->dictLookupNF("Trans");
if (!(trans.isRef() || trans.isDict() || trans.isNull())) {
error(errSyntaxError, -1, "Page transition object (page {0:d}) is wrong type ({1:s})",
num, trans.getTypeName());
- trans.free();
+ trans = Object();
}
// duration
- pageDict->lookupNF("Dur", &tmp);
+ Object tmp = pageDict->dictLookupNF("Dur");
if (!(tmp.isNum() || tmp.isNull())) {
error(errSyntaxError, -1, "Page duration object (page {0:d}) is wrong type ({1:s})",
num, tmp.getTypeName());
} else if (tmp.isNum()) {
duration = tmp.getNum();
}
- tmp.free();
// annotations
- pageDict->lookupNF("Annots", &annotsObj);
+ annotsObj = pageDict->dictLookupNF("Annots");
if (!(annotsObj.isRef() || annotsObj.isArray() || annotsObj.isNull())) {
error(errSyntaxError, -1, "Page annotations object (page {0:d}) is wrong type ({1:s})",
num, annotsObj.getTypeName());
- annotsObj.free();
goto err2;
}
// contents
- pageDict->lookupNF("Contents", &contents);
+ contents = pageDict->dictLookupNF("Contents");
if (!(contents.isRef() || contents.isArray() ||
contents.isNull())) {
error(errSyntaxError, -1, "Page contents object (page {0:d}) is wrong type ({1:s})",
num, contents.getTypeName());
- contents.free();
goto err1;
}
// thumb
- pageDict->lookupNF("Thumb", &thumb);
+ thumb = pageDict->dictLookupNF("Thumb");
if (!(thumb.isStream() || thumb.isNull() || thumb.isRef())) {
error(errSyntaxError, -1, "Page thumb object (page {0:d}) is wrong type ({1:s})",
num, thumb.getTypeName());
- thumb.free();
- thumb.initNull();
+ thumb.setToNull();
}
// actions
- pageDict->lookupNF("AA", &actions);
+ actions = pageDict->dictLookupNF("AA");
if (!(actions.isDict() || actions.isNull())) {
error(errSyntaxError, -1, "Page additional action object (page {0:d}) is wrong type ({1:s})",
num, actions.getTypeName());
- actions.free();
- actions.initNull();
+ actions.setToNull();
}
return;
- trans.initNull();
err2:
- annotsObj.initNull();
+ annotsObj.setToNull();
err1:
- contents.initNull();
+ contents.setToNull();
ok = gFalse;
}
Page::~Page() {
delete attrs;
delete annots;
- pageObj.free();
- annotsObj.free();
- contents.free();
- trans.free();
- thumb.free();
- actions.free();
#if MULTITHREADED
gDestroyMutex(&mutex);
#endif
@@ -366,6 +337,11 @@
return attrs->getResourceDict();
}
+Object *Page::getResourceDictObject()
+{
+ return attrs->getResourceDictObject();
+}
+
Dict *Page::getResourceDictCopy(XRef *xrefA) {
pageLocker();
Dict *dict = attrs->getResourceDict();
@@ -376,42 +352,32 @@
Object obj1;
Dict *pageDict = pageObj.getDict()->copy(xrefA);
xref = xrefA;
- trans.free();
- pageDict->lookupNF("Trans", &trans);
- annotsObj.free();
- pageDict->lookupNF("Annots", &annotsObj);
- contents.free();
- pageDict->lookupNF("Contents", &contents);
+ trans = pageDict->lookupNF("Trans");
+ annotsObj = pageDict->lookupNF("Annots");
+ contents = pageDict->lookupNF("Contents");
if (contents.isArray()) {
- contents.free();
- pageDict->lookupNF("Contents", &obj1)->getArray()->copy(xrefA, &contents);
- obj1.free();
+ obj1 = pageDict->lookupNF("Contents");
+ contents = obj1.getArray()->copy(xrefA);
}
- thumb.free();
- pageDict->lookupNF("Thumb", &thumb);
- actions.free();
- pageDict->lookupNF("AA", &actions);
- pageDict->lookup("Resources", &obj1);
+ thumb = pageDict->lookupNF("Thumb");
+ actions = pageDict->lookupNF("AA");
+ obj1 = pageDict->lookup("Resources");
if (obj1.isDict()) {
- attrs->replaceResource(obj1);
+ attrs->replaceResource(std::move(obj1));
}
- obj1.free();
delete pageDict;
}
Annots *Page::getAnnots(XRef *xrefA) {
if (!annots) {
- Object obj;
- annots = new Annots(doc, num, getAnnots(&obj, (xrefA == NULL) ? xref : xrefA));
- obj.free();
+ Object obj = getAnnotsObject(xrefA);
+ annots = new Annots(doc, num, &obj);
}
return annots;
}
void Page::addAnnot(Annot *annot) {
- Object obj1;
- Object tmp;
Ref annotRef = annot->getRef ();
// Make sure we have annots before adding the new one
@@ -425,24 +391,22 @@
// page doesn't have annots array,
// we have to create it
- obj1.initArray(xref);
- obj1.arrayAdd(tmp.initRef (annotRef.num, annotRef.gen));
- tmp.free();
+ Object obj1 = Object(new Array(xref));
+ obj1.arrayAdd(Object(annotRef.num, annotRef.gen));
annotsRef = xref->addIndirectObject (&obj1);
- annotsObj.initRef(annotsRef.num, annotsRef.gen);
- pageObj.dictSet ("Annots", &annotsObj);
+ annotsObj = Object(annotsRef.num, annotsRef.gen);
+ pageObj.dictSet ("Annots", Object(annotsRef.num, annotsRef.gen));
xref->setModifiedObject (&pageObj, pageRef);
} else {
- getAnnots(&obj1);
+ Object obj1 = getAnnotsObject();
if (obj1.isArray()) {
- obj1.arrayAdd (tmp.initRef (annotRef.num, annotRef.gen));
+ obj1.arrayAdd (Object(annotRef.num, annotRef.gen));
if (annotsObj.isRef())
xref->setModifiedObject (&obj1, annotsObj.getRef());
else
xref->setModifiedObject (&pageObj, pageRef);
}
- obj1.free();
}
// Popup annots are already handled by markup annots,
@@ -464,27 +428,24 @@
void Page::removeAnnot(Annot *annot) {
Ref annotRef = annot->getRef();
- Object annArray;
pageLocker();
- getAnnots(&annArray);
+ Object annArray = getAnnotsObject();
if (annArray.isArray()) {
int idx = -1;
// Get annotation position
for (int i = 0; idx == -1 && i < annArray.arrayGetLength(); ++i) {
- Object tmp;
- if (annArray.arrayGetNF(i, &tmp)->isRef()) {
+ Object tmp = annArray.arrayGetNF(i);
+ if (tmp.isRef()) {
Ref currAnnot = tmp.getRef();
if (currAnnot.num == annotRef.num && currAnnot.gen == annotRef.gen) {
idx = i;
}
}
- tmp.free();
}
if (idx == -1) {
error(errInternal, -1, "Annotation doesn't belong to this page");
- annArray.free();
return;
}
annots->removeAnnot(annot); // Gracefully fails on popup windows
@@ -497,7 +458,6 @@
xref->setModifiedObject (&pageObj, pageRef);
}
}
- annArray.free();
annot->removeReferencedObjects(); // Note: Might recurse in removeAnnot again
annot->setPage(0, gFalse);
}
@@ -573,7 +533,6 @@
void *annotDisplayDecideCbkData,
GBool copyXRef) {
Gfx *gfx;
- Object obj;
Annots *annotList;
int i;
@@ -595,7 +554,7 @@
printing,
abortCheckCbk, abortCheckCbkData, localXRef);
- contents.fetch(localXRef, &obj);
+ Object obj = contents.fetch(localXRef);
if (!obj.isNull()) {
gfx->saveState();
gfx->display(&obj);
@@ -605,7 +564,6 @@
// OutputDev
out->dump();
}
- obj.free();
// draw annotations
annotList = getAnnots();
@@ -633,15 +591,12 @@
}
void Page::display(Gfx *gfx) {
- Object obj;
-
- contents.fetch(xref, &obj);
+ Object obj = contents.fetch(xref);
if (!obj.isNull()) {
gfx->saveState();
gfx->display(&obj);
gfx->restoreState();
}
- obj.free();
}
GBool Page::loadThumb(unsigned char **data_out,
@@ -650,7 +605,7 @@
{
unsigned int pixbufdatasize;
int width, height, bits;
- Object obj1, fetched_thumb;
+ Object obj1;
Dict *dict;
GfxColorSpace *colorSpace;
GBool success = gFalse;
@@ -659,9 +614,8 @@
/* Get stream dict */
pageLocker();
- thumb.fetch(xref, &fetched_thumb);
+ Object fetched_thumb = thumb.fetch(xref);
if (!fetched_thumb.isStream()) {
- fetched_thumb.free();
return gFalse;
}
@@ -683,25 +637,21 @@
pixbufdatasize = width * height * 3;
/* Get color space */
- dict->lookup ("ColorSpace", &obj1);
+ obj1 = dict->lookup ("ColorSpace");
if (obj1.isNull ()) {
- obj1.free ();
- dict->lookup ("CS", &obj1);
+ obj1 = dict->lookup ("CS");
}
colorSpace = GfxColorSpace::parse(NULL, &obj1, NULL, NULL);
- obj1.free();
if (!colorSpace) {
fprintf (stderr, "Error: Cannot parse color space\n");
goto fail1;
}
- dict->lookup("Decode", &obj1);
+ obj1 = dict->lookup("Decode");
if (obj1.isNull()) {
- obj1.free();
- dict->lookup("D", &obj1);
+ obj1 = dict->lookup("D");
}
colorMap = new GfxImageColorMap(bits, &obj1, colorSpace);
- obj1.free();
if (!colorMap->isOk()) {
fprintf (stderr, "Error: invalid colormap\n");
delete colorMap;
@@ -744,8 +694,6 @@
delete colorMap;
fail1:
- fetched_thumb.free();
-
return success;
}
@@ -842,21 +790,16 @@
}
LinkAction* Page::getAdditionalAction(PageAdditionalActionsType type) {
- Object additionalActionsObject;
- LinkAction *linkAction = NULL;
-
- if (actions.fetch(doc->getXRef(), &additionalActionsObject)->isDict()) {
+ LinkAction *linkAction = nullptr;
+ Object additionalActionsObject = actions.fetch(doc->getXRef());
+ if (additionalActionsObject.isDict()) {
const char *key = (type == actionOpenPage ? "O" :
type == actionClosePage ? "C" : NULL);
- Object actionObject;
-
- if (additionalActionsObject.dictLookup(key, &actionObject)->isDict())
+ Object actionObject = additionalActionsObject.dictLookup(key);
+ if (actionObject.isDict())
linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI());
- actionObject.free();
}
- additionalActionsObject.free();
-
return linkAction;
}
diff --git a/poppler/Page.h b/poppler/Page.h
index 2aaabae..2a59713 100644
--- a/poppler/Page.h
+++ b/poppler/Page.h
@@ -20,7 +20,7 @@
// Copyright (C) 2007 Julien Rebetez <julienr@svn.gnome.org>
// Copyright (C) 2008 Iñigo Martínez <inigomartinez@gmail.com>
// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
-// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2012, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com>
//
@@ -107,8 +107,10 @@
? separationInfo.getDict() : (Dict *)NULL; }
Dict *getResourceDict()
{ return resources.isDict() ? resources.getDict() : (Dict *)NULL; }
- void replaceResource(Object obj1)
- { resources.free(); obj1.copy(&resources); }
+ Object *getResourceDictObject()
+ { return &resources; }
+ void replaceResource(Object &&obj1)
+ { resources = std::move(obj1); }
// Clip all other boxes to the MediaBox.
void clipBoxes();
@@ -141,7 +143,7 @@
public:
// Constructor.
- Page(PDFDoc *docA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form);
+ Page(PDFDoc *docA, int numA, Object *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form);
// Destructor.
~Page();
@@ -177,10 +179,11 @@
// Get resource dictionary.
Dict *getResourceDict();
+ Object *getResourceDictObject();
Dict *getResourceDictCopy(XRef *xrefA);
// Get annotations array.
- Object *getAnnots(Object *obj, XRef *xrefA = NULL) { return annotsObj.fetch((xrefA == NULL) ? xref : xrefA, obj); }
+ Object getAnnotsObject(XRef *xrefA = nullptr) { return annotsObj.fetch(xrefA ? xrefA : xref); }
// Add a new annotation to the page
void addAnnot(Annot *annot);
// Remove an existing annotation from the page
@@ -193,14 +196,14 @@
Annots *getAnnots(XRef *xrefA = NULL);
// Get contents.
- Object *getContents(Object *obj) { return contents.fetch(xref, obj); }
+ Object getContents() { return contents.fetch(xref); }
// Get thumb.
- Object *getThumb(Object *obj) { return thumb.fetch(xref, obj); }
+ Object getThumb() { return thumb.fetch(xref); }
GBool loadThumb(unsigned char **data, int *width, int *height, int *rowstride);
// Get transition.
- Object *getTrans(Object *obj) { return trans.fetch(xref, obj); }
+ Object getTrans() { return trans.fetch(xref); }
// Get form.
FormPageWidgets *getFormWidgets();
@@ -211,7 +214,7 @@
double getDuration() { return duration; }
// Get actions
- Object *getActions(Object *obj) { return actions.fetch(xref, obj); }
+ Object getActions() { return actions.fetch(xref); }
enum PageAdditionalActionsType {
actionOpenPage, ///< Performed when opening the page
diff --git a/poppler/PageLabelInfo.cc b/poppler/PageLabelInfo.cc
index 3153377..d771024 100644
--- a/poppler/PageLabelInfo.cc
+++ b/poppler/PageLabelInfo.cc
@@ -3,7 +3,7 @@
// This file is under the GPLv2 or later license
//
// Copyright (C) 2005-2006 Kristian Høgsberg <krh@redhat.com>
-// Copyright (C) 2005, 2009, 2013 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2005, 2009, 2013, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2011 Simon Kellner <kellner@kit.edu>
// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it>
//
@@ -22,10 +22,9 @@
#include "PageLabelInfo_p.h"
PageLabelInfo::Interval::Interval(Object *dict, int baseA) {
- Object obj;
-
style = None;
- if (dict->dictLookup("S", &obj)->isName()) {
+ Object obj = dict->dictLookup("S");
+ if (obj.isName()) {
if (obj.isName("D")) {
style = Arabic;
} else if (obj.isName("R")) {
@@ -38,19 +37,18 @@
style = LowercaseLatin;
}
}
- obj.free();
- if (dict->dictLookup("P", &obj)->isString())
+ obj = dict->dictLookup("P");
+ if (obj.isString())
prefix = obj.getString()->copy();
else
prefix = new GooString("");
- obj.free();
- if (dict->dictLookup("St", &obj)->isInt())
+ obj = dict->dictLookup("St");
+ if (obj.isInt())
first = obj.getInt();
else
first = 1;
- obj.free();
base = baseA;
}
@@ -86,40 +84,32 @@
}
void PageLabelInfo::parse(Object *tree) {
- Object nums, obj;
- Object kids, kid, limits, low, high;
- int i, base;
- Interval *interval;
-
// leaf node
- if (tree->dictLookup("Nums", &nums)->isArray()) {
- for (i = 0; i < nums.arrayGetLength(); i += 2) {
- if (!nums.arrayGet(i, &obj)->isInt()) {
- obj.free();
+ Object nums = tree->dictLookup("Nums");
+ if (nums.isArray()) {
+ for (int i = 0; i < nums.arrayGetLength(); i += 2) {
+ Object obj = nums.arrayGet(i);
+ if (!obj.isInt()) {
continue;
}
- base = obj.getInt();
- obj.free();
- if (!nums.arrayGet(i + 1, &obj)->isDict()) {
- obj.free();
+ int base = obj.getInt();
+ obj = nums.arrayGet(i + 1);
+ if (!obj.isDict()) {
continue;
}
- interval = new Interval(&obj, base);
- obj.free();
- intervals.append(interval);
+ intervals.append(new Interval(&obj, base));
}
}
- nums.free();
- if (tree->dictLookup("Kids", &kids)->isArray()) {
- for (i = 0; i < kids.arrayGetLength(); ++i) {
- if (kids.arrayGet(i, &kid)->isDict())
+ Object kids = tree->dictLookup("Kids");
+ if (kids.isArray()) {
+ for (int i = 0; i < kids.arrayGetLength(); ++i) {
+ Object kid = kids.arrayGet(i);
+ if (kid.isDict())
parse(&kid);
- kid.free();
}
}
- kids.free();
}
GBool PageLabelInfo::labelToIndex(GooString *label, int *index)
diff --git a/poppler/PageTransition.cc b/poppler/PageTransition.cc
index d5a84f8..07a2c65 100644
--- a/poppler/PageTransition.cc
+++ b/poppler/PageTransition.cc
@@ -1,6 +1,6 @@
/* PageTransition.cc
* Copyright (C) 2005, Net Integration Technologies, Inc.
- * Copyright (C) 2010, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2010, 2017, Albert Astals Cid <aacid@kde.org>
* Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com>
* Copyright (C) 2015, Arseniy Lartsev <arseniy@alumni.chalmers.se>
*
@@ -50,7 +50,8 @@
dict = trans->getDict();
// get type
- if (dict->lookup("S", &obj)->isName()) {
+ obj = dict->lookup("S");
+ if (obj.isName()) {
const char *s = obj.getName();
if (strcmp("R", s) == 0)
@@ -78,16 +79,16 @@
else if (strcmp("Fade", s) == 0)
type = transitionFade;
}
- obj.free();
// get duration
- if (dict->lookup("D", &obj)->isNum()) {
+ obj = dict->lookup("D");
+ if (obj.isNum()) {
duration = obj.getNum();
}
- obj.free();
// get alignment
- if (dict->lookup("Dm", &obj)->isName()) {
+ obj = dict->lookup("Dm");
+ if (obj.isName()) {
const char *dm = obj.getName();
if (strcmp("H", dm) == 0)
@@ -95,10 +96,10 @@
else if (strcmp("V", dm) == 0)
alignment = transitionVertical;
}
- obj.free();
// get direction
- if (dict->lookup("M", &obj)->isName()) {
+ obj = dict->lookup("M");
+ if (obj.isName()) {
const char *m = obj.getName();
if (strcmp("I", m) == 0)
@@ -106,31 +107,30 @@
else if (strcmp("O", m) == 0)
direction = transitionOutward;
}
- obj.free();
// get angle
- if (dict->lookup("Di", &obj)->isInt()) {
+ obj = dict->lookup("Di");
+ if (obj.isInt()) {
angle = obj.getInt();
}
- obj.free();
- if (dict->lookup("Di", &obj)->isName()) {
+ obj = dict->lookup("Di");
+ if (obj.isName()) {
if (strcmp("None", obj.getName()) == 0)
angle = 0;
}
- obj.free();
// get scale
- if (dict->lookup("SS", &obj)->isNum()) {
+ obj = dict->lookup("SS");
+ if (obj.isNum()) {
scale = obj.getNum();
}
- obj.free();
// get rectangular
- if (dict->lookup("B", &obj)->isBool()) {
+ obj = dict->lookup("B");
+ if (obj.isBool()) {
rectangular = obj.getBool();
}
- obj.free();
}
PageTransition::~PageTransition()
diff --git a/poppler/Parser.cc b/poppler/Parser.cc
index 8079ca1..07e220f 100644
--- a/poppler/Parser.cc
+++ b/poppler/Parser.cc
@@ -50,56 +50,50 @@
lexer = lexerA;
inlineImg = 0;
allowStreams = allowStreamsA;
- lexer->getObj(&buf1);
- lexer->getObj(&buf2);
+ buf1 = lexer->getObj();
+ buf2 = lexer->getObj();
}
Parser::~Parser() {
- buf1.free();
- buf2.free();
delete lexer;
}
-Object *Parser::getObj(Object *obj, int recursion)
+Object Parser::getObj(int recursion)
{
- return getObj(obj, gFalse, NULL, cryptRC4, 0, 0, 0, recursion);
+ return getObj(gFalse, NULL, cryptRC4, 0, 0, 0, recursion);
}
-Object *Parser::getObj(Object *obj, GBool simpleOnly,
+Object Parser::getObj(GBool simpleOnly,
Guchar *fileKey,
CryptAlgorithm encAlgorithm, int keyLength,
int objNum, int objGen, int recursion,
GBool strict) {
+ Object obj;
char *key;
Stream *str;
- Object obj2;
- int num;
DecryptStream *decrypt;
GooString *s, *s2;
int c;
// refill buffer after inline image data
if (inlineImg == 2) {
- buf1.free();
- buf2.free();
- lexer->getObj(&buf1);
- lexer->getObj(&buf2);
+ buf1 = lexer->getObj();
+ buf2 = lexer->getObj();
inlineImg = 0;
}
if (unlikely(recursion >= recursionLimit)) {
- obj->free();
- obj->initError();
- return obj;
+ return Object(objError);
}
// array
if (!simpleOnly && buf1.isCmd("[")) {
shift();
- obj->initArray(xref);
- while (!buf1.isCmd("]") && !buf1.isEOF())
- obj->arrayAdd(getObj(&obj2, gFalse, fileKey, encAlgorithm, keyLength,
- objNum, objGen, recursion + 1));
+ obj = Object(new Array(xref));
+ while (!buf1.isCmd("]") && !buf1.isEOF()) {
+ Object obj2 = getObj(gFalse, fileKey, encAlgorithm, keyLength, objNum, objGen, recursion + 1);
+ obj.arrayAdd(std::move(obj2));
+ }
if (buf1.isEOF()) {
error(errSyntaxError, getPos(), "End of file inside array");
if (strict) goto err;
@@ -109,7 +103,7 @@
// dictionary or stream
} else if (!simpleOnly && buf1.isCmd("<<")) {
shift(objNum);
- obj->initDict(xref);
+ obj = Object(new Dict(xref));
while (!buf1.isCmd(">>") && !buf1.isEOF()) {
if (!buf1.isName()) {
error(errSyntaxError, getPos(), "Dictionary key must be a name object");
@@ -124,10 +118,11 @@
if (strict && buf1.isError()) goto err;
break;
}
- obj->dictAdd(key, getObj(&obj2, gFalse, fileKey, encAlgorithm, keyLength, objNum, objGen, recursion + 1));
+ Object obj2 = getObj(gFalse, fileKey, encAlgorithm, keyLength, objNum, objGen, recursion + 1);
if (unlikely(obj2.isError() && recursion + 1 >= recursionLimit)) {
break;
}
+ obj.dictAdd(key, std::move(obj2));
}
}
if (buf1.isEOF()) {
@@ -137,13 +132,12 @@
// stream objects are not allowed inside content streams or
// object streams
if (buf2.isCmd("stream")) {
- if (allowStreams && (str = makeStream(obj, fileKey, encAlgorithm, keyLength,
+ if (allowStreams && (str = makeStream(std::move(obj), fileKey, encAlgorithm, keyLength,
objNum, objGen, recursion + 1,
strict))) {
- obj->initStream(str);
+ return Object(str);
} else {
- obj->free();
- obj->initError();
+ return Object(objError);
}
} else {
shift();
@@ -151,23 +145,22 @@
// indirect reference or integer
} else if (buf1.isInt()) {
- num = buf1.getInt();
+ const int num = buf1.getInt();
shift();
if (buf1.isInt() && buf2.isCmd("R")) {
- obj->initRef(num, buf1.getInt());
+ const int gen = buf1.getInt();
shift();
shift();
+ return Object(num, gen);
} else {
- obj->initInt(num);
+ return Object(num);
}
// string
} else if (buf1.isString() && fileKey) {
s = buf1.getString();
s2 = new GooString();
- obj2.initNull();
- decrypt = new DecryptStream(new MemStream(s->getCString(), 0,
- s->getLength(), &obj2),
+ decrypt = new DecryptStream(new MemStream(s->getCString(), 0, s->getLength(), Object(objNull)),
fileKey, encAlgorithm, keyLength,
objNum, objGen);
decrypt->reset();
@@ -175,7 +168,7 @@
s2->append((char)c);
}
delete decrypt;
- obj->initString(s2);
+ obj = Object(s2);
shift();
// simple object
@@ -183,25 +176,20 @@
// avoid re-allocating memory for complex objects like strings by
// shallow copy of <buf1> to <obj> and nulling <buf1> so that
// subsequent buf1.free() won't free this memory
- buf1.shallowCopy(obj);
- buf1.initNull();
+ obj = std::move(buf1);
shift();
}
return obj;
err:
- obj->free();
- obj->initError();
- return obj;
-
+ return Object(objError);
}
-Stream *Parser::makeStream(Object *dict, Guchar *fileKey,
+Stream *Parser::makeStream(Object &&dict, Guchar *fileKey,
CryptAlgorithm encAlgorithm, int keyLength,
int objNum, int objGen, int recursion,
GBool strict) {
- Object obj;
BaseStream *baseStr;
Stream *str;
Goffset length;
@@ -215,16 +203,13 @@
pos = str->getPos();
// get length
- dict->dictLookup("Length", &obj, recursion);
+ Object obj = dict.dictLookup("Length", recursion);
if (obj.isInt()) {
length = obj.getInt();
- obj.free();
} else if (obj.isInt64()) {
length = obj.getInt64();
- obj.free();
} else {
error(errSyntaxError, getPos(), "Bad 'Length' attribute in stream");
- obj.free();
if (strict) return NULL;
length = 0;
}
@@ -261,9 +246,7 @@
// shift until we find the proper endstream or we change to another object or reach eof
length = lexer->getPos() - pos;
if (buf1.isCmd("endstream")) {
- obj.initInt64(length);
- dict->dictSet("Length", &obj);
- obj.free();
+ dict.dictSet("Length", Object(length));
}
} else {
// When building the xref we can't use it so use this
@@ -274,7 +257,7 @@
}
// make base stream
- str = baseStr->makeSubStream(pos, gTrue, length, dict);
+ str = baseStr->makeSubStream(pos, gTrue, length, std::move(dict));
// handle decryption
if (fileKey) {
@@ -283,7 +266,7 @@
}
// get filters
- str = str->addFilters(dict, recursion);
+ str = str->addFilters(str->getDict(), recursion);
return str;
}
@@ -301,12 +284,12 @@
lexer->skipChar(); // skip char after 'ID' command
inlineImg = 1;
}
- buf1.free();
- buf2.shallowCopy(&buf1);
+ buf1 = std::move(buf2);
if (inlineImg > 0) // don't buffer inline image data
- buf2.initNull();
- else
- lexer->getObj(&buf2, objNum);
+ buf2.setToNull();
+ else {
+ buf2 = lexer->getObj(objNum);
+ }
}
void Parser::shift(const char *cmdA, int objNum) {
@@ -322,13 +305,12 @@
lexer->skipChar(); // skip char after 'ID' command
inlineImg = 1;
}
- buf1.free();
- buf2.shallowCopy(&buf1);
+ buf1 = std::move(buf2);
if (inlineImg > 0) {
- buf2.initNull();
+ buf2.setToNull();
} else if (buf1.isCmd(cmdA)) {
- lexer->getObj(&buf2, objNum);
+ buf2 = lexer->getObj(objNum);
} else {
- lexer->getObj(&buf2, cmdA, objNum);
+ buf2 = lexer->getObj(cmdA, objNum);
}
}
diff --git a/poppler/Parser.h b/poppler/Parser.h
index 1ce9445..d275110 100644
--- a/poppler/Parser.h
+++ b/poppler/Parser.h
@@ -13,7 +13,7 @@
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
-// Copyright (C) 2006, 2010, 2013 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006, 2010, 2013, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2012 Hib Eris <hib@hiberis.nl>
// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de>
@@ -48,13 +48,14 @@
// Get the next object from the input stream. If <simpleOnly> is
// true, do not parse compound objects (arrays, dictionaries, or
// streams).
- Object *getObj(Object *obj, GBool simpleOnly = gFalse,
+ Object getObj(GBool simpleOnly = gFalse,
Guchar *fileKey = NULL,
CryptAlgorithm encAlgorithm = cryptRC4, int keyLength = 0,
int objNum = 0, int objGen = 0, int recursion = 0,
GBool strict = gFalse);
- Object *getObj(Object *obj, int recursion);
+ Object getObj(int recursion);
+ template<typename T> Object getObj(T) = delete;
// Get stream.
Stream *getStream() { return lexer->getStream(); }
@@ -70,7 +71,7 @@
Object buf1, buf2; // next two tokens
int inlineImg; // set when inline image data is encountered
- Stream *makeStream(Object *dict, Guchar *fileKey,
+ Stream *makeStream(Object &&dict, Guchar *fileKey,
CryptAlgorithm encAlgorithm, int keyLength,
int objNum, int objGen, int recursion,
GBool strict);
diff --git a/poppler/PopplerCache.cc b/poppler/PopplerCache.cc
index 970c003..4fa0a44 100644
--- a/poppler/PopplerCache.cc
+++ b/poppler/PopplerCache.cc
@@ -5,7 +5,7 @@
// This file is licensed under the GPLv2 or later
//
// Copyright (C) 2009 Koji Otani <sho@bbr.jp>
-// Copyright (C) 2009, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009, 2010, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org>
//
//========================================================================
@@ -121,14 +121,9 @@
class ObjectItem : public PopplerCacheItem {
public:
- ObjectItem(Object *obj)
+ ObjectItem(Object &&obj)
{
- obj->copy(&item);
- }
-
- ~ObjectItem()
- {
- item.free();
+ item = std::move(obj);
}
Object item;
@@ -144,20 +139,18 @@
}
Object *PopplerObjectCache::put(const Ref &ref) {
- Object obj;
- xref->fetch(ref.num, ref.gen, &obj);
+ Object obj = xref->fetch(ref.num, ref.gen);
ObjectKey *key = new ObjectKey(ref.num, ref.gen);
- ObjectItem *item = new ObjectItem(&obj);
+ ObjectItem *item = new ObjectItem(std::move(obj));
cache->put(key, item);
- obj.free();
return &item->item;
}
-Object *PopplerObjectCache::lookup(const Ref &ref, Object *obj) {
+Object PopplerObjectCache::lookup(const Ref &ref) {
ObjectKey key(ref.num, ref.gen);
ObjectItem *item = static_cast<ObjectItem *>(cache->lookup(key));
- return item ? item->item.copy(obj) : obj->initNull();
+ return item ? item->item.copy() : Object(objNull);
}
diff --git a/poppler/PopplerCache.h b/poppler/PopplerCache.h
index 74010a2..f9d8a1d 100644
--- a/poppler/PopplerCache.h
+++ b/poppler/PopplerCache.h
@@ -5,7 +5,7 @@
// This file is licensed under the GPLv2 or later
//
// Copyright (C) 2009 Koji Otani <sho@bbr.jp>
-// Copyright (C) 2009, 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2009, 2010, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org>
//
//========================================================================
@@ -68,7 +68,7 @@
~PopplerObjectCache();
Object *put(const Ref &ref);
- Object *lookup(const Ref &ref, Object *obj);
+ Object lookup(const Ref &ref);
private:
XRef *xref;
diff --git a/poppler/Rendition.cc b/poppler/Rendition.cc
index c040bf2..89bf1a5 100644
--- a/poppler/Rendition.cc
+++ b/poppler/Rendition.cc
@@ -7,6 +7,7 @@
// Pino Toscano <pino@kde.org> (c) 2008
// Carlos Garcia Campos <carlosgc@gnome.org> (c) 2010
// Tobias Koenig <tobias.koenig@kdab.com> (c) 2012
+// Albert Astals Cid <aacid@kde.org> (C) 2017
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -44,26 +45,26 @@
}
void MediaWindowParameters::parseFWParams(Object* obj) {
- Object tmp;
-
- if (obj->dictLookup("D", &tmp)->isArray()) {
+ Object tmp = obj->dictLookup("D");
+ if (tmp.isArray()) {
Array * dim = tmp.getArray();
if (dim->getLength() >= 2) {
- Object dd;
- if (dim->get(0, &dd)->isInt()) {
+ Object dd = dim->get(0);
+ if (dd.isInt()) {
width = dd.getInt();
}
- dd.free();
- if (dim->get(1, &dd)->isInt()) {
+
+ dd = dim->get(1);
+ if (dd.isInt()) {
height = dd.getInt();
}
- dd.free();
+
}
}
- tmp.free();
- if (obj->dictLookup("RT", &tmp)->isInt()) {
+ tmp = obj->dictLookup("RT");
+ if (tmp.isInt()) {
int t = tmp.getInt();
switch(t) {
case 0: relativeTo = windowRelativeToDocument; break;
@@ -71,9 +72,9 @@
case 2: relativeTo = windowRelativeToDesktop; break;
}
}
- tmp.free();
- if (obj->dictLookup("P",&tmp)->isInt()) {
+ tmp = obj->dictLookup("P");
+ if (tmp.isInt()) {
int t = tmp.getInt();
switch(t) {
@@ -115,21 +116,19 @@
break;
}
}
- tmp.free();
- if (obj->dictLookup("T", &tmp)->isBool()) {
+ tmp = obj->dictLookup("T");
+ if (tmp.isBool()) {
hasTitleBar = tmp.getBool();
}
- tmp.free();
- if (obj->dictLookup("UC", &tmp)->isBool()) {
+ tmp = obj->dictLookup("UC");
+ if (tmp.isBool()) {
hasCloseButton = tmp.getBool();
}
- tmp.free();
- if (obj->dictLookup("R", &tmp)->isInt()) {
+ tmp = obj->dictLookup("R");
+ if (tmp.isInt()) {
isResizeable = (tmp.getInt() != 0);
}
- tmp.free();
-
}
MediaParameters::MediaParameters() {
@@ -148,20 +147,18 @@
}
void MediaParameters::parseMediaPlayParameters(Object* obj) {
-
- Object tmp;
-
- if (obj->dictLookup("V", &tmp)->isInt()) {
+ Object tmp = obj->dictLookup("V");
+ if (tmp.isInt()) {
volume = tmp.getInt();
}
- tmp.free();
- if (obj->dictLookup("C", &tmp)->isBool()) {
+ tmp = obj->dictLookup("C");
+ if (tmp.isBool()) {
showControls = tmp.getBool();
}
- tmp.free();
- if (obj->dictLookup("F", &tmp)->isInt()) {
+ tmp = obj->dictLookup("F");
+ if (tmp.isInt()) {
int t = tmp.getInt();
switch(t) {
@@ -173,47 +170,42 @@
case 5: fittingPolicy = fittingUndefined; break;
}
}
- tmp.free();
// duration parsing
// duration's default value is set to 0, which means : intrinsinc media duration
- if (obj->dictLookup("D", &tmp)->isDict()) {
- Object oname, ddict, tmp2;
- if (tmp.dictLookup("S", &oname)->isName()) {
+ tmp = obj->dictLookup("D");
+ if (tmp.isDict()) {
+ Object oname = tmp.dictLookup("S");
+ if (oname.isName()) {
char* name = oname.getName();
if (!strcmp(name, "F"))
duration = -1; // infinity
else if (!strcmp(name, "T")) {
- if (tmp.dictLookup("T", &ddict)->isDict()) {
- if (ddict.dictLookup("V", &tmp2)->isNum()) {
+ Object ddict = tmp.dictLookup("T");
+ if (ddict.isDict()) {
+ Object tmp2 = ddict.dictLookup("V");
+ if (tmp2.isNum()) {
duration = Gulong(tmp2.getNum());
}
- tmp2.free();
}
- ddict.free();
}
}
- oname.free();
}
- tmp.free();
-
- if (obj->dictLookup("A", &tmp)->isBool()) {
+ tmp = obj->dictLookup("A");
+ if (tmp.isBool()) {
autoPlay = tmp.getBool();
}
- tmp.free();
- if (obj->dictLookup("RC", &tmp)->isNum()) {
+ tmp = obj->dictLookup("RC");
+ if (tmp.isNum()) {
repeatCount = tmp.getNum();
}
- tmp.free();
-
}
void MediaParameters::parseMediaScreenParameters(Object* obj) {
- Object tmp;
-
- if (obj->dictLookup("W", &tmp)->isInt()) {
+ Object tmp = obj->dictLookup("W");
+ if (tmp.isInt()) {
int t = tmp.getInt();
switch(t) {
@@ -223,102 +215,84 @@
case 3: windowParams.type = MediaWindowParameters::windowEmbedded; break;
}
}
- tmp.free();
// background color
- if (obj->dictLookup("B", &tmp)->isArray()) {
+ tmp = obj->dictLookup("B");
+ if (tmp.isArray()) {
Array* color = tmp.getArray();
- Object component;
-
- color->get(0, &component);
+ Object component = color->get(0);
bgColor.r = component.getNum();
- component.free();
- color->get(1, &component);
+ component = color->get(1);
bgColor.g = component.getNum();
- component.free();
- color->get(2, &component);
+ component = color->get(2);
bgColor.b = component.getNum();
- component.free();
}
- tmp.free();
-
// opacity
- if (obj->dictLookup("O", &tmp)->isNum()) {
+ tmp = obj->dictLookup("O");
+ if (tmp.isNum()) {
opacity = tmp.getNum();
}
- tmp.free();
if (windowParams.type == MediaWindowParameters::windowFloating) {
- Object winDict;
- if (obj->dictLookup("F",&winDict)->isDict()) {
+ Object winDict = obj->dictLookup("F");
+ if (winDict.isDict()) {
windowParams.parseFWParams(&winDict);
}
- winDict.free();
}
}
MediaRendition::~MediaRendition() {
- if (fileName)
- delete fileName;
- if (contentType)
- delete contentType;
-
- if (embeddedStream && (!embeddedStream->decRef())) {
- delete embeddedStream;
- }
+ delete fileName;
+ delete contentType;
}
MediaRendition::MediaRendition(Object* obj) {
- Object tmp, tmp2;
GBool hasClip = gFalse;
ok = gTrue;
fileName = NULL;
contentType = NULL;
isEmbedded = gFalse;
- embeddedStream = NULL;
//
// Parse media clip data
//
- if (obj->dictLookup("C", &tmp2)->isDict()) { // media clip
+ Object tmp2 = obj->dictLookup("C");
+ if (tmp2.isDict()) { // media clip
hasClip = gTrue;
- if (tmp2.dictLookup("S", &tmp)->isName()) {
+ Object tmp = tmp2.dictLookup("S");
+ if (tmp.isName()) {
if (!strcmp(tmp.getName(), "MCD")) { // media clip data
- Object obj1, obj2;
- if (tmp2.dictLookup("D", &obj1)->isDict()) {
- if (obj1.dictLookup("F", &obj2)->isString()) {
+ Object obj1 = tmp2.dictLookup("D");
+ if (obj1.isDict()) {
+ Object obj2 = obj1.dictLookup("F");
+ if (obj2.isString()) {
fileName = obj2.getString()->copy();
}
- obj2.free();
- if (obj1.dictLookup("EF", &obj2)->isDict()) {
- Object embedded;
- if (obj2.dictLookup("F", &embedded)->isStream()) {
+ obj2 = obj1.dictLookup("EF");
+ if (obj2.isDict()) {
+ Object embedded = obj2.dictLookup("F");
+ if (embedded.isStream()) {
isEmbedded = gTrue;
- embeddedStream = embedded.getStream();
- // "copy" stream
- embeddedStream->incRef();
+ embeddedStreamObject = embedded.copy();
}
- embedded.free();
}
- obj2.free();
// TODO: D might be a form XObject too
} else {
error (errSyntaxError, -1, "Invalid Media Clip Data");
ok = gFalse;
}
- obj1.free();
// FIXME: ignore CT if D is a form XObject
- if (tmp2.dictLookup("CT", &obj1)->isString()) {
+ obj1 = tmp2.dictLookup("CT");
+ if (obj1.isString()) {
contentType = obj1.getString()->copy();
}
- obj1.free();
} else if (!strcmp(tmp.getName(), "MCS")) { // media clip data
// TODO
}
@@ -326,55 +300,69 @@
error (errSyntaxError, -1, "Invalid Media Clip");
ok = gFalse;
}
- tmp.free();
}
- tmp2.free();
if (!ok)
return;
//
// parse Media Play Parameters
- if (obj->dictLookup("P", &tmp2)->isDict()) { // media play parameters
- Object params;
- if (tmp2.dictLookup("MH", ¶ms)->isDict()) {
+ tmp2 = obj->dictLookup("P");
+ if (tmp2.isDict()) { // media play parameters
+ Object params = tmp2.dictLookup("MH");
+ if (params.isDict()) {
MH.parseMediaPlayParameters(¶ms);
}
- params.free();
- if (tmp2.dictLookup("BE", ¶ms)->isDict()) {
+ params = tmp2.dictLookup("BE");
+ if (params.isDict()) {
BE.parseMediaPlayParameters(¶ms);
}
- params.free();
} else if (!hasClip) {
error (errSyntaxError, -1, "Invalid Media Rendition");
ok = gFalse;
}
- tmp2.free();
//
// parse Media Screen Parameters
- if (obj->dictLookup("SP", &tmp2)->isDict()) { // media screen parameters
- Object params;
- if (tmp2.dictLookup("MH", ¶ms)->isDict()) {
+ tmp2 = obj->dictLookup("SP");
+ if (tmp2.isDict()) { // media screen parameters
+ Object params = tmp2.dictLookup("MH");
+ if (params.isDict()) {
MH.parseMediaScreenParameters(¶ms);
}
- params.free();
- if (tmp2.dictLookup("BE", ¶ms)->isDict()) {
+ params = tmp2.dictLookup("BE");
+ if (params.isDict()) {
BE.parseMediaScreenParameters(¶ms);
}
- params.free();
}
- tmp2.free();
+}
+
+MediaRendition::MediaRendition(const MediaRendition &other) {
+ ok = other.ok;
+ MH = other.MH;
+ BE = other.BE;
+ isEmbedded = other.isEmbedded;
+ embeddedStreamObject = other.embeddedStreamObject.copy();
+
+ if (other.contentType)
+ contentType = other.contentType->copy();
+ else
+ contentType = nullptr;
+
+ if (other.fileName)
+ fileName = other.fileName->copy();
+ else
+ fileName = nullptr;
}
void MediaRendition::outputToFile(FILE* fp) {
if (!isEmbedded)
return;
- embeddedStream->reset();
+ embeddedStreamObject.streamReset();
while (1) {
- int c = embeddedStream->getChar();
+ int c = embeddedStreamObject.streamGetChar();
if (c == EOF)
break;
@@ -383,19 +371,9 @@
}
-MediaRendition *MediaRendition::copy() {
- // call default copy constructor
- MediaRendition* new_media = new MediaRendition(*this);
-
- if (contentType)
- new_media->contentType = contentType->copy();
- if (fileName)
- new_media->fileName = fileName->copy();
-
- if (new_media->embeddedStream)
- new_media->embeddedStream->incRef();
-
- return new_media;
+MediaRendition* MediaRendition::copy()
+{
+ return new MediaRendition(*this);
}
// TODO: SelectorRendition
diff --git a/poppler/Rendition.h b/poppler/Rendition.h
index 75bfeff..5a937f2 100644
--- a/poppler/Rendition.h
+++ b/poppler/Rendition.h
@@ -5,6 +5,7 @@
//---------------------------------------------------------------------------------
// Hugo Mercier <hmercier31[at]gmail.com> (c) 2008
// Carlos Garcia Campos <carlosgc@gnome.org> (c) 2010
+// Albert Astals Cid <aacid@kde.org> (C) 2017
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -118,6 +119,7 @@
class MediaRendition {
public:
MediaRendition(Object *obj);
+ MediaRendition(const MediaRendition &other);
~MediaRendition();
GBool isOk () { return ok; }
@@ -129,7 +131,8 @@
GooString* getFileName() { return fileName; }
GBool getIsEmbedded() { return isEmbedded; }
- Stream* getEmbbededStream() { return embeddedStream; }
+ Stream* getEmbbededStream() { return isEmbedded ? embeddedStreamObject.getStream() : nullptr; }
+ Object* getEmbbededStreamObject() { return isEmbedded ? &embeddedStreamObject : nullptr; }
// write embedded stream to file
void outputToFile(FILE*);
@@ -148,7 +151,7 @@
GooString* contentType;
// if it's embedded
- Stream* embeddedStream;
+ Object embeddedStreamObject;
// if it's not embedded
GooString* fileName;
diff --git a/poppler/SecurityHandler.cc b/poppler/SecurityHandler.cc
index 9e0546e..f774ce8 100644
--- a/poppler/SecurityHandler.cc
+++ b/poppler/SecurityHandler.cc
@@ -13,7 +13,7 @@
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
-// Copyright (C) 2010, 2012, 2015 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2010, 2012, 2015, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2014 Fabio D'Urso <fabiodurso@hotmail.it>
// Copyright (C) 2016 Alok Anand <alok4nand@gmail.com>
@@ -46,13 +46,12 @@
//------------------------------------------------------------------------
SecurityHandler *SecurityHandler::make(PDFDoc *docA, Object *encryptDictA) {
- Object filterObj;
SecurityHandler *secHdlr;
#ifdef ENABLE_PLUGINS
XpdfSecurityHandler *xsh;
#endif
- encryptDictA->dictLookup("Filter", &filterObj);
+ Object filterObj = encryptDictA->dictLookup("Filter");
if (filterObj.isName("Standard")) {
secHdlr = new StandardSecurityHandler(docA, encryptDictA);
} else if (filterObj.isName()) {
@@ -72,7 +71,6 @@
"Missing or invalid 'Filter' entry in encryption dictionary");
secHdlr = NULL;
}
- filterObj.free();
return secHdlr;
}
@@ -147,13 +145,6 @@
Object *encryptDictA):
SecurityHandler(docA)
{
- Object versionObj, revisionObj, lengthObj;
- Object ownerKeyObj, userKeyObj, ownerEncObj, userEncObj;
- Object permObj, fileIDObj, fileIDObj1;
- Object cryptFiltersObj, streamFilterObj, stringFilterObj;
- Object cryptFilterObj, cfmObj, cfLengthObj;
- Object encryptMetadataObj;
-
ok = gFalse;
fileID = NULL;
ownerKey = NULL;
@@ -162,21 +153,20 @@
userEnc = NULL;
fileKeyLength = 0;
- encryptDictA->dictLookup("V", &versionObj);
- encryptDictA->dictLookup("R", &revisionObj);
- encryptDictA->dictLookup("Length", &lengthObj);
- encryptDictA->dictLookup("O", &ownerKeyObj);
- encryptDictA->dictLookup("U", &userKeyObj);
- encryptDictA->dictLookup("OE", &ownerEncObj);
- encryptDictA->dictLookup("UE", &userEncObj);
- encryptDictA->dictLookup("P", &permObj);
+ Object versionObj = encryptDictA->dictLookup("V");
+ Object revisionObj = encryptDictA->dictLookup("R");
+ Object lengthObj = encryptDictA->dictLookup("Length");
+ Object ownerKeyObj = encryptDictA->dictLookup("O");
+ Object userKeyObj = encryptDictA->dictLookup("U");
+ Object ownerEncObj = encryptDictA->dictLookup("OE");
+ Object userEncObj = encryptDictA->dictLookup("UE");
+ Object permObj = encryptDictA->dictLookup("P");
if (permObj.isInt64()) {
unsigned int permUint = permObj.getInt64();
int perms = permUint - UINT_MAX - 1;
- permObj.free();
- permObj.initInt(perms);
+ permObj = Object(perms);
}
- doc->getXRef()->getTrailerDict()->dictLookup("ID", &fileIDObj);
+ Object fileIDObj = doc->getXRef()->getTrailerDict()->dictLookup("ID");
if (versionObj.isInt() &&
revisionObj.isInt() &&
permObj.isInt() &&
@@ -210,9 +200,9 @@
//~ same)
if ((encVersion == 4 || encVersion == 5) &&
(encRevision == 4 || encRevision == 5 || encRevision == 6)) {
- encryptDictA->dictLookup("CF", &cryptFiltersObj);
- encryptDictA->dictLookup("StmF", &streamFilterObj);
- encryptDictA->dictLookup("StrF", &stringFilterObj);
+ Object cryptFiltersObj = encryptDictA->dictLookup("CF");
+ Object streamFilterObj = encryptDictA->dictLookup("StmF");
+ Object stringFilterObj = encryptDictA->dictLookup("StrF");
if (cryptFiltersObj.isDict() &&
streamFilterObj.isName() &&
stringFilterObj.isName() &&
@@ -221,52 +211,43 @@
// no encryption on streams or strings
encVersion = encRevision = -1;
} else {
- if (cryptFiltersObj.dictLookup(streamFilterObj.getName(),
- &cryptFilterObj)->isDict()) {
- cryptFilterObj.dictLookup("CFM", &cfmObj);
+ Object cryptFilterObj = cryptFiltersObj.dictLookup(streamFilterObj.getName());
+ if (cryptFilterObj.isDict()) {
+ Object cfmObj = cryptFilterObj.dictLookup("CFM");
if (cfmObj.isName("V2")) {
encVersion = 2;
encRevision = 3;
- if (cryptFilterObj.dictLookup("Length",
- &cfLengthObj)->isInt()) {
+ Object cfLengthObj = cryptFilterObj.dictLookup("Length");
+ if (cfLengthObj.isInt()) {
//~ according to the spec, this should be cfLengthObj / 8
fileKeyLength = cfLengthObj.getInt();
}
- cfLengthObj.free();
} else if (cfmObj.isName("AESV2")) {
encVersion = 2;
encRevision = 3;
encAlgorithm = cryptAES;
- if (cryptFilterObj.dictLookup("Length",
- &cfLengthObj)->isInt()) {
+ Object cfLengthObj = cryptFilterObj.dictLookup("Length");
+ if (cfLengthObj.isInt()) {
//~ according to the spec, this should be cfLengthObj / 8
fileKeyLength = cfLengthObj.getInt();
}
- cfLengthObj.free();
} else if (cfmObj.isName("AESV3")) {
encVersion = 5;
// let encRevision be 5 or 6
encAlgorithm = cryptAES256;
- if (cryptFilterObj.dictLookup("Length",
- &cfLengthObj)->isInt()) {
+ Object cfLengthObj = cryptFilterObj.dictLookup("Length");
+ if (cfLengthObj.isInt()) {
//~ according to the spec, this should be cfLengthObj / 8
fileKeyLength = cfLengthObj.getInt();
}
- cfLengthObj.free();
}
- cfmObj.free();
}
- cryptFilterObj.free();
}
}
- stringFilterObj.free();
- streamFilterObj.free();
- cryptFiltersObj.free();
- if (encryptDictA->dictLookup("EncryptMetadata",
- &encryptMetadataObj)->isBool()) {
+ Object encryptMetadataObj = encryptDictA->dictLookup("EncryptMetadata");
+ if (encryptMetadataObj.isBool()) {
encryptMetadata = encryptMetadataObj.getBool();
}
- encryptMetadataObj.free();
}
permFlags = permObj.getInt();
ownerKey = ownerKeyObj.getString()->copy();
@@ -274,12 +255,12 @@
if (encVersion >= 1 && encVersion <= 2 &&
encRevision >= 2 && encRevision <= 3) {
if (fileIDObj.isArray()) {
- if (fileIDObj.arrayGet(0, &fileIDObj1)->isString()) {
+ Object fileIDObj1 = fileIDObj.arrayGet(0);
+ if (fileIDObj1.isString()) {
fileID = fileIDObj1.getString()->copy();
} else {
fileID = new GooString();
}
- fileIDObj1.free();
} else {
fileID = new GooString();
}
@@ -310,15 +291,6 @@
} else {
error(errSyntaxError, -1, "Weird encryption info");
}
- fileIDObj.free();
- permObj.free();
- userEncObj.free();
- ownerEncObj.free();
- userKeyObj.free();
- ownerKeyObj.free();
- lengthObj.free();
- revisionObj.free();
- versionObj.free();
}
StandardSecurityHandler::~StandardSecurityHandler() {
@@ -408,7 +380,6 @@
ExternalSecurityHandler::~ExternalSecurityHandler() {
(*xsh->freeDoc)(xsh->handlerData, docData);
- encryptDict.free();
}
void *ExternalSecurityHandler::makeAuthData(GooString *ownerPassword,
diff --git a/poppler/Sound.cc b/poppler/Sound.cc
index 6129fdc..c0dd6cc 100644
--- a/poppler/Sound.cc
+++ b/poppler/Sound.cc
@@ -1,6 +1,6 @@
/* Sound.cc - an object that holds the sound structure
* Copyright (C) 2006-2007, Pino Toscano <pino@kde.org>
- * Copyright (C) 2009, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2009, 2017, Albert Astals Cid <aacid@kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -38,21 +38,18 @@
Dict *dict = str->getDict();
if (dict == NULL)
return NULL;
- Object tmp;
// the Dict must have the 'R' key of type num
- dict->lookup("R", &tmp);
+ Object tmp = dict->lookup("R");
if (tmp.isNum()) {
return new Sound(obj);
} else {
- return NULL;
+ return nullptr;
}
}
Sound::Sound(Object *obj, bool readAttrs)
{
- streamObj = new Object();
- streamObj->initNull();
- obj->copy(streamObj);
+ streamObj = obj->copy();
fileName = NULL;
samplingRate = 0.0;
@@ -62,43 +59,37 @@
if (readAttrs)
{
- Object tmp;
- Dict *dict = streamObj->getStream()->getDict();
- dict->lookup("F", &tmp);
+ Dict *dict = streamObj.getStream()->getDict();
+ Object tmp = dict->lookup("F");
if (!tmp.isNull()) {
- Object obj1;
// valid 'F' key -> external file
kind = soundExternal;
- if (getFileSpecNameForPlatform (&tmp, &obj1)) {
+ Object obj1 = getFileSpecNameForPlatform (&tmp);
+ if (obj1.isString()) {
fileName = obj1.getString()->copy();
- obj1.free();
}
} else {
// no file specification, then the sound data have to be
// extracted from the stream
kind = soundEmbedded;
}
- tmp.free();
// sampling rate
- dict->lookup("R", &tmp);
+ tmp = dict->lookup("R");
if (tmp.isNum()) {
samplingRate = tmp.getNum();
}
- tmp.free();
// sound channels
- dict->lookup("C", &tmp);
+ tmp = dict->lookup("C");
if (tmp.isInt()) {
channels = tmp.getInt();
}
- tmp.free();
// bits per sample
- dict->lookup("B", &tmp);
+ tmp = dict->lookup("B");
if (tmp.isInt()) {
bitsPerSample = tmp.getInt();
}
- tmp.free();
// encoding format
- dict->lookup("E", &tmp);
+ tmp = dict->lookup("E");
if (tmp.isName())
{
const char *enc = tmp.getName();
@@ -112,25 +103,22 @@
encoding = soundALaw;
}
}
- tmp.free();
}
}
Sound::~Sound()
{
delete fileName;
- streamObj->free();
- delete streamObj;
}
Stream *Sound::getStream()
{
- return streamObj->getStream();
+ return streamObj.getStream();
}
Sound *Sound::copy()
{
- Sound *newsound = new Sound(streamObj, false);
+ Sound *newsound = new Sound(&streamObj, false);
newsound->kind = kind;
if (fileName) {
diff --git a/poppler/Sound.h b/poppler/Sound.h
index acb0f8d..5e33cb5 100644
--- a/poppler/Sound.h
+++ b/poppler/Sound.h
@@ -1,5 +1,6 @@
/* Sound.h - an object that holds the sound structure
* Copyright (C) 2006-2007, Pino Toscano <pino@kde.org>
+ * Copyright (C) 2017, Albert Astals Cid <aacid@kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -46,7 +47,7 @@
// Destructor
~Sound();
- Object *getObject() { return streamObj; }
+ Object *getObject() { return &streamObj; }
Stream *getStream();
SoundKind getSoundKind() { return kind; }
@@ -62,7 +63,7 @@
// Create a sound. The Object obj is ensured to be a Stream with a Dict
Sound(Object *obj, bool readAttrs = true);
- Object *streamObj;
+ Object streamObj;
SoundKind kind;
GooString *fileName;
double samplingRate;
diff --git a/poppler/SplashOutputDev.cc b/poppler/SplashOutputDev.cc
index 5502be6..60edb8a 100644
--- a/poppler/SplashOutputDev.cc
+++ b/poppler/SplashOutputDev.cc
@@ -2076,8 +2076,10 @@
delete id;
delete fontLoc;
fontLoc = NULL;
- if (fontsrc && !fontsrc->isFile)
+ if (fontsrc && !fontsrc->isFile) {
fontsrc->unref();
+ fontsrc = nullptr;
+ }
id = new SplashOutFontFileID(gfxFont->getID());
if ((fontFile = fontEngine->getFontFile(id))) {
@@ -3798,7 +3800,7 @@
int maskHeight, GBool maskInvert,
GBool maskInterpolate) {
GfxImageColorMap *maskColorMap;
- Object maskDecode, decodeLow, decodeHigh;
+ Object decodeLow, decodeHigh;
double *ctm;
SplashCoord mat[6];
SplashOutMaskedImageData imgData;
@@ -3825,14 +3827,11 @@
// If the mask is higher resolution than the image, use
// drawSoftMaskedImage() instead.
if (maskWidth > width || maskHeight > height) {
- decodeLow.initInt(maskInvert ? 0 : 1);
- decodeHigh.initInt(maskInvert ? 1 : 0);
- maskDecode.initArray((xref) ? xref : doc->getXRef());
- maskDecode.arrayAdd(&decodeLow);
- maskDecode.arrayAdd(&decodeHigh);
+ Object maskDecode(new Array((xref) ? xref : doc->getXRef()));
+ maskDecode.arrayAdd(Object(maskInvert ? 0 : 1));
+ maskDecode.arrayAdd(Object(maskInvert ? 1 : 0));
maskColorMap = new GfxImageColorMap(1, &maskDecode,
new GfxDeviceGrayColorSpace());
- maskDecode.free();
drawSoftMaskedImage(state, ref, str, width, height, colorMap, interpolate,
maskStr, maskWidth, maskHeight, maskColorMap, maskInterpolate);
delete maskColorMap;
@@ -4021,9 +4020,7 @@
maskStr->reset();
maskStr->doGetChars(maskWidth * maskHeight, data);
maskStr->close();
- Object maskDict;
- maskDict.initDict(maskStr->getDict());
- maskStr = new MemStream((char *)data, 0, maskWidth * maskHeight, &maskDict);
+ maskStr = new MemStream((char *)data, 0, maskWidth * maskHeight, maskStr->getDictObject()->copy());
((MemStream *) maskStr)->setNeedFree(gTrue);
}
imgMaskData.imgStr = new ImageStream(maskStr, maskWidth,
diff --git a/poppler/StdinPDFDocBuilder.cc b/poppler/StdinPDFDocBuilder.cc
index 571ee46..f4aa12c 100644
--- a/poppler/StdinPDFDocBuilder.cc
+++ b/poppler/StdinPDFDocBuilder.cc
@@ -5,7 +5,7 @@
// This file is licensed under the GPLv2 or later
//
// Copyright 2010 Hib Eris <hib@hiberis.nl>
-// Copyright 2010 Albert Astals Cid <aacid@kde.org>
+// Copyright 2010, 2017 Albert Astals Cid <aacid@kde.org>
//
//========================================================================
@@ -23,12 +23,9 @@
StdinPDFDocBuilder::buildPDFDoc(const GooString &uri, GooString *ownerPassword,
GooString *userPassword, void *guiDataA)
{
- Object obj;
-
- obj.initNull();
CachedFile *cachedFile = new CachedFile(new StdinCacheLoader(), NULL);
return new PDFDoc(new CachedFileStream(cachedFile, 0, gFalse,
- cachedFile->getLength(), &obj),
+ cachedFile->getLength(), Object(objNull)),
ownerPassword, userPassword);
}
diff --git a/poppler/Stream.cc b/poppler/Stream.cc
index 606902f..df76765 100644
--- a/poppler/Stream.cc
+++ b/poppler/Stream.cc
@@ -169,51 +169,45 @@
return new GooString();
}
-Stream *Stream::addFilters(Object *dict, int recursion) {
+Stream *Stream::addFilters(Dict *dict, int recursion) {
Object obj, obj2;
Object params, params2;
Stream *str;
int i;
str = this;
- dict->dictLookup("Filter", &obj, recursion);
+ obj = dict->lookup("Filter", recursion);
if (obj.isNull()) {
- obj.free();
- dict->dictLookup("F", &obj, recursion);
+ obj = dict->lookup("F", recursion);
}
- dict->dictLookup("DecodeParms", ¶ms, recursion);
+ params = dict->lookup("DecodeParms", recursion);
if (params.isNull()) {
- params.free();
- dict->dictLookup("DP", ¶ms, recursion);
+ params = dict->lookup("DP", recursion);
}
if (obj.isName()) {
str = makeFilter(obj.getName(), str, ¶ms, recursion, dict);
} else if (obj.isArray()) {
for (i = 0; i < obj.arrayGetLength(); ++i) {
- obj.arrayGet(i, &obj2, recursion);
+ obj2 = obj.arrayGet(i, recursion);
if (params.isArray())
- params.arrayGet(i, ¶ms2, recursion);
+ params2 = params.arrayGet(i, recursion);
else
- params2.initNull();
+ params2.setToNull();
if (obj2.isName()) {
str = makeFilter(obj2.getName(), str, ¶ms2, recursion);
} else {
error(errSyntaxError, getPos(), "Bad filter name");
str = new EOFStream(str);
}
- obj2.free();
- params2.free();
}
} else if (!obj.isNull()) {
error(errSyntaxError, getPos(), "Bad 'Filter' attribute in stream");
}
- obj.free();
- params.free();
return str;
}
-Stream *Stream::makeFilter(char *name, Stream *str, Object *params, int recursion, Object *dict) {
+Stream *Stream::makeFilter(char *name, Stream *str, Object *params, int recursion, Dict *dict) {
int pred; // parameters
int colors;
int bits;
@@ -234,26 +228,21 @@
bits = 8;
early = 1;
if (params->isDict()) {
- params->dictLookup("Predictor", &obj, recursion);
+ obj = params->dictLookup("Predictor", recursion);
if (obj.isInt())
pred = obj.getInt();
- obj.free();
- params->dictLookup("Columns", &obj, recursion);
+ obj = params->dictLookup("Columns", recursion);
if (obj.isInt())
columns = obj.getInt();
- obj.free();
- params->dictLookup("Colors", &obj, recursion);
+ obj = params->dictLookup("Colors", recursion);
if (obj.isInt())
colors = obj.getInt();
- obj.free();
- params->dictLookup("BitsPerComponent", &obj, recursion);
+ obj = params->dictLookup("BitsPerComponent", recursion);
if (obj.isInt())
bits = obj.getInt();
- obj.free();
- params->dictLookup("EarlyChange", &obj, recursion);
+ obj = params->dictLookup("EarlyChange", recursion);
if (obj.isInt())
early = obj.getInt();
- obj.free();
}
str = new LZWStream(str, pred, columns, colors, bits, early);
} else if (!strcmp(name, "RunLengthDecode") || !strcmp(name, "RL")) {
@@ -267,41 +256,34 @@
endOfBlock = gTrue;
black = gFalse;
if (params->isDict()) {
- params->dictLookup("K", &obj, recursion);
+ obj = params->dictLookup("K", recursion);
if (obj.isInt()) {
encoding = obj.getInt();
}
- obj.free();
- params->dictLookup("EndOfLine", &obj, recursion);
+ obj = params->dictLookup("EndOfLine", recursion);
if (obj.isBool()) {
endOfLine = obj.getBool();
}
- obj.free();
- params->dictLookup("EncodedByteAlign", &obj, recursion);
+ obj = params->dictLookup("EncodedByteAlign", recursion);
if (obj.isBool()) {
byteAlign = obj.getBool();
}
- obj.free();
- params->dictLookup("Columns", &obj, recursion);
+ obj = params->dictLookup("Columns", recursion);
if (obj.isInt()) {
columns = obj.getInt();
}
- obj.free();
- params->dictLookup("Rows", &obj, recursion);
+ obj = params->dictLookup("Rows", recursion);
if (obj.isInt()) {
rows = obj.getInt();
}
- obj.free();
- params->dictLookup("EndOfBlock", &obj, recursion);
+ obj = params->dictLookup("EndOfBlock", recursion);
if (obj.isBool()) {
endOfBlock = obj.getBool();
}
- obj.free();
- params->dictLookup("BlackIs1", &obj, recursion);
+ obj = params->dictLookup("BlackIs1", recursion);
if (obj.isBool()) {
black = obj.getBool();
}
- obj.free();
}
str = new CCITTFaxStream(str, encoding, endOfLine, byteAlign,
columns, rows, endOfBlock, black);
@@ -309,10 +291,10 @@
#if HAVE_DCT_DECODER
int colorXform = -1;
if (params->isDict()) {
- if (params->dictLookup("ColorTransform", &obj, recursion)->isInt()) {
+ obj = params->dictLookup("ColorTransform", recursion);
+ if (obj.isInt()) {
colorXform = obj.getInt();
}
- obj.free();
}
str = new DCTStream(str, colorXform, dict, recursion);
#else
@@ -325,33 +307,27 @@
colors = 1;
bits = 8;
if (params->isDict()) {
- params->dictLookup("Predictor", &obj, recursion);
+ obj = params->dictLookup("Predictor", recursion);
if (obj.isInt())
pred = obj.getInt();
- obj.free();
- params->dictLookup("Columns", &obj, recursion);
+ obj = params->dictLookup("Columns", recursion);
if (obj.isInt())
columns = obj.getInt();
- obj.free();
- params->dictLookup("Colors", &obj, recursion);
+ obj = params->dictLookup("Colors", recursion);
if (obj.isInt())
colors = obj.getInt();
- obj.free();
- params->dictLookup("BitsPerComponent", &obj, recursion);
+ obj = params->dictLookup("BitsPerComponent", recursion);
if (obj.isInt())
bits = obj.getInt();
- obj.free();
}
str = new FlateStream(str, pred, columns, colors, bits);
} else if (!strcmp(name, "JBIG2Decode")) {
if (params->isDict()) {
XRef *xref = params->getDict()->getXRef();
- params->dictLookupNF("JBIG2Globals", &obj);
- obj.fetch(xref, &globals, recursion);
+ obj = params->dictLookupNF("JBIG2Globals");
+ globals = obj.fetch(xref, recursion);
}
str = new JBIG2Stream(str, &globals, &obj);
- globals.free();
- obj.free();
} else if (!strcmp(name, "JPXDecode")) {
#ifdef HAVE_JPX_DECODER
str = new JPXStream(str);
@@ -377,7 +353,6 @@
//------------------------------------------------------------------------
OutStream::OutStream ()
{
- ref = 1;
}
OutStream::~OutStream ()
@@ -426,13 +401,12 @@
// BaseStream
//------------------------------------------------------------------------
-BaseStream::BaseStream(Object *dictA, Goffset lengthA) {
- dict = *dictA;
+BaseStream::BaseStream(Object &&dictA, Goffset lengthA) {
+ dict = std::move(dictA);
length = lengthA;
}
BaseStream::~BaseStream() {
- dict.free();
}
//------------------------------------------------------------------------
@@ -781,8 +755,8 @@
//------------------------------------------------------------------------
FileStream::FileStream(GooFile* fileA, Goffset startA, GBool limitedA,
- Goffset lengthA, Object *dictA):
- BaseStream(dictA, lengthA) {
+ Goffset lengthA, Object &&dictA):
+ BaseStream(std::move(dictA), lengthA) {
file = fileA;
offset = start = startA;
limited = limitedA;
@@ -798,12 +772,12 @@
}
BaseStream *FileStream::copy() {
- return new FileStream(file, start, limited, length, &dict);
+ return new FileStream(file, start, limited, length, dict.copy());
}
Stream *FileStream::makeSubStream(Goffset startA, GBool limitedA,
- Goffset lengthA, Object *dictA) {
- return new FileStream(file, startA, limitedA, lengthA, dictA);
+ Goffset lengthA, Object &&dictA) {
+ return new FileStream(file, startA, limitedA, lengthA, std::move(dictA));
}
void FileStream::reset() {
@@ -872,8 +846,8 @@
//------------------------------------------------------------------------
CachedFileStream::CachedFileStream(CachedFile *ccA, Goffset startA,
- GBool limitedA, Goffset lengthA, Object *dictA)
- : BaseStream(dictA, lengthA)
+ GBool limitedA, Goffset lengthA, Object &&dictA)
+ : BaseStream(std::move(dictA), lengthA)
{
cc = ccA;
start = startA;
@@ -893,14 +867,14 @@
BaseStream *CachedFileStream::copy() {
cc->incRefCnt();
- return new CachedFileStream(cc, start, limited, length, &dict);
+ return new CachedFileStream(cc, start, limited, length, dict.copy());
}
Stream *CachedFileStream::makeSubStream(Goffset startA, GBool limitedA,
- Goffset lengthA, Object *dictA)
+ Goffset lengthA, Object &&dictA)
{
cc->incRefCnt();
- return new CachedFileStream(cc, startA, limitedA, lengthA, dictA);
+ return new CachedFileStream(cc, startA, limitedA, lengthA, std::move(dictA));
}
void CachedFileStream::reset()
@@ -975,8 +949,8 @@
// MemStream
//------------------------------------------------------------------------
-MemStream::MemStream(char *bufA, Goffset startA, Goffset lengthA, Object *dictA):
- BaseStream(dictA, lengthA) {
+MemStream::MemStream(char *bufA, Goffset startA, Goffset lengthA, Object &&dictA):
+ BaseStream(std::move(dictA), lengthA) {
buf = bufA;
start = startA;
length = lengthA;
@@ -992,11 +966,11 @@
}
BaseStream *MemStream::copy() {
- return new MemStream(buf, start, length, &dict);
+ return new MemStream(buf, start, length, dict.copy());
}
Stream *MemStream::makeSubStream(Goffset startA, GBool limited,
- Goffset lengthA, Object *dictA) {
+ Goffset lengthA, Object &&dictA) {
MemStream *subStr;
Goffset newLength;
@@ -1005,7 +979,7 @@
} else {
newLength = lengthA;
}
- subStr = new MemStream(buf, startA, newLength, dictA);
+ subStr = new MemStream(buf, startA, newLength, std::move(dictA));
return subStr;
}
@@ -1058,9 +1032,9 @@
// EmbedStream
//------------------------------------------------------------------------
-EmbedStream::EmbedStream(Stream *strA, Object *dictA,
+EmbedStream::EmbedStream(Stream *strA, Object &&dictA,
GBool limitedA, Goffset lengthA):
- BaseStream(dictA, lengthA) {
+ BaseStream(std::move(dictA), lengthA) {
str = strA;
limited = limitedA;
length = lengthA;
@@ -1075,7 +1049,7 @@
}
Stream *EmbedStream::makeSubStream(Goffset start, GBool limitedA,
- Goffset lengthA, Object *dictA) {
+ Goffset lengthA, Object &&dictA) {
error(errInternal, -1, "Called makeSubStream() on EmbedStream");
return NULL;
}
@@ -2445,7 +2419,7 @@
63
};
-DCTStream::DCTStream(Stream *strA, int colorXformA, Object *dict, int recursion):
+DCTStream::DCTStream(Stream *strA, int colorXformA, Dict *dict, int recursion):
FilterStream(strA) {
int i, j;
diff --git a/poppler/Stream.h b/poppler/Stream.h
index f3cf38b..2317080 100644
--- a/poppler/Stream.h
+++ b/poppler/Stream.h
@@ -15,7 +15,7 @@
//
// Copyright (C) 2005 Jeff Muizelaar <jeff@infidigm.net>
// Copyright (C) 2008 Julien Rebetez <julien@fhtagn.net>
-// Copyright (C) 2008, 2010, 2011, 2016 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008, 2010, 2011, 2016, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com>
// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
@@ -105,10 +105,6 @@
// Destructor.
virtual ~Stream();
- // Reference counting.
- int incRef();
- int decRef();
-
// Get kind of stream.
virtual StreamKind getKind() = 0;
@@ -213,6 +209,7 @@
// Get the dictionary associated with this stream.
virtual Dict *getDict() = 0;
+ virtual Object *getDictObject() = 0;
// Is this an encoding filter?
virtual GBool isEncoder() { return gFalse; }
@@ -226,13 +223,19 @@
// Add filters to this stream according to the parameters in <dict>.
// Returns the new stream.
- Stream *addFilters(Object *dict, int recursion = 0);
+ Stream *addFilters(Dict *dict, int recursion = 0);
private:
+ friend class Object; // for incRef/decRef
+
+ // Reference counting.
+ int incRef();
+ int decRef();
+
virtual GBool hasGetChars() { return false; }
virtual int getChars(int nChars, Guchar *buffer);
- Stream *makeFilter(char *name, Stream *str, Object *params, int recursion = 0, Object *dict = NULL);
+ Stream *makeFilter(char *name, Stream *str, Object *params, int recursion = 0, Dict *dict = nullptr);
int ref; // reference count
#if MULTITHREADED
@@ -254,10 +257,6 @@
// Desctructor.
virtual ~OutStream ();
- // Reference counting.
- int incRef() { return ++ref; }
- int decRef() { return --ref; }
-
// Close the stream
virtual void close() = 0;
@@ -268,10 +267,6 @@
virtual void put (char c) = 0;
virtual void printf (const char *format, ...) GCC_PRINTF_FORMAT(2,3) = 0;
-
-private:
- int ref; // reference count
-
};
//------------------------------------------------------------------------
@@ -306,16 +301,18 @@
class BaseStream: public Stream {
public:
- BaseStream(Object *dictA, Goffset lengthA);
+ // TODO Mirar si puedo hacer que dictA sea un puntero
+ BaseStream(Object &&dictA, Goffset lengthA);
~BaseStream();
virtual BaseStream *copy() = 0;
virtual Stream *makeSubStream(Goffset start, GBool limited,
- Goffset length, Object *dict) = 0;
+ Goffset length, Object &&dict) = 0;
void setPos(Goffset pos, int dir = 0) override = 0;
GBool isBinary(GBool last = gTrue) override { return last; }
BaseStream *getBaseStream() override { return this; }
Stream *getUndecodedStream() override { return this; }
Dict *getDict() override { return dict.getDict(); }
+ Object *getDictObject() override { return &dict; }
virtual GooString *getFileName() { return NULL; }
virtual Goffset getLength() { return length; }
@@ -346,6 +343,7 @@
BaseStream *getBaseStream() override { return str->getBaseStream(); }
Stream *getUndecodedStream() override { return str->getUndecodedStream(); }
Dict *getDict() override { return str->getDict(); }
+ Object *getDictObject() override { return str->getDictObject(); }
Stream *getNextStream() override { return str; }
int getUnfilteredChar () override { return str->getUnfilteredChar(); }
@@ -447,11 +445,11 @@
public:
FileStream(GooFile* fileA, Goffset startA, GBool limitedA,
- Goffset lengthA, Object *dictA);
+ Goffset lengthA, Object &&dictA);
~FileStream();
BaseStream *copy() override;
Stream *makeSubStream(Goffset startA, GBool limitedA,
- Goffset lengthA, Object *dictA) override;
+ Goffset lengthA, Object &&dictA) override;
StreamKind getKind() override { return strFile; }
void reset() override;
void close() override;
@@ -517,11 +515,11 @@
public:
CachedFileStream(CachedFile *ccA, Goffset startA, GBool limitedA,
- Goffset lengthA, Object *dictA);
+ Goffset lengthA, Object &&dictA);
~CachedFileStream();
BaseStream *copy() override;
Stream *makeSubStream(Goffset startA, GBool limitedA,
- Goffset lengthA, Object *dictA) override;
+ Goffset lengthA, Object &&dictA) override;
StreamKind getKind() override { return strCachedFile; }
void reset() override;
void close() override;
@@ -560,11 +558,11 @@
class MemStream: public BaseStream {
public:
- MemStream(char *bufA, Goffset startA, Goffset lengthA, Object *dictA);
+ MemStream(char *bufA, Goffset startA, Goffset lengthA, Object &&dictA);
~MemStream();
BaseStream *copy() override;
Stream *makeSubStream(Goffset start, GBool limited,
- Goffset lengthA, Object *dictA) override;
+ Goffset lengthA, Object &&dictA) override;
StreamKind getKind() override { return strWeird; }
void reset() override;
void close() override;
@@ -609,11 +607,11 @@
class EmbedStream: public BaseStream {
public:
- EmbedStream(Stream *strA, Object *dictA, GBool limitedA, Goffset lengthA);
+ EmbedStream(Stream *strA, Object &&dictA, GBool limitedA, Goffset lengthA);
~EmbedStream();
BaseStream *copy() override;
Stream *makeSubStream(Goffset start, GBool limitedA,
- Goffset lengthA, Object *dictA) override;
+ Goffset lengthA, Object &&dictA) override;
StreamKind getKind() override { return str->getKind(); }
void reset() override {}
int getChar() override;
@@ -868,7 +866,7 @@
class DCTStream: public FilterStream {
public:
- DCTStream(Stream *strA, int colorXformA, Object *dict, int recursion);
+ DCTStream(Stream *strA, int colorXformA, Dict *dict, int recursion);
virtual ~DCTStream();
StreamKind getKind() override { return strDCT; }
void reset() override;
diff --git a/poppler/StructElement.cc b/poppler/StructElement.cc
index c668820..0fbd336 100644
--- a/poppler/StructElement.cc
+++ b/poppler/StructElement.cc
@@ -6,7 +6,7 @@
//
// Copyright 2013, 2014 Igalia S.L.
// Copyright 2014 Luigi Scarso <luigi.scarso@gmail.com>
-// Copyright 2014 Albert Astals Cid <aacid@kde.org>
+// Copyright 2014, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright 2015 Dmytro Morgun <lztoad@gmail.com>
//
//========================================================================
@@ -170,18 +170,15 @@
GBool okay = gTrue;
for (int i = 0; i < 3; i++) {
- Object obj;
- if (!value->arrayGet(i, &obj)->isNum()) {
+ Object obj = value->arrayGet(i);
+ if (!obj.isNum()) {
okay = gFalse;
- obj.free();
break;
}
if (obj.getNum() < 0.0 || obj.getNum() > 1.0) {
okay = gFalse;
- obj.free();
break;
}
- obj.free();
}
return okay;
@@ -220,14 +217,11 @@
\
GBool okay = gTrue; \
for (int i = 0; i < value->arrayGetLength(); i++) { \
- Object obj; \
- value->arrayGet(i, &obj); \
+ Object obj = value->arrayGet(i); \
if ((!allowNulls && obj.isNull()) || !checkItem(&obj)) { \
okay = gFalse; \
- obj.free(); \
break; \
} \
- obj.free(); \
} \
return okay; \
}
@@ -254,46 +248,17 @@
};
struct AttributeDefaults {
- Object Inline;
- Object LrTb;
- Object Normal;
- Object Distribute;
- Object off;
- Object Zero;
- Object Auto;
- Object Start;
- Object None;
- Object Before;
- Object Nat1;
-
- AttributeDefaults() {
- Inline.initName("Inline");
- LrTb.initName("LrTb");
- Normal.initName("Normal");
- Distribute.initName("Distribute");
- off.initName("off");
-
- Zero.initReal(0.0);
- Auto.initName("Auto");
- Start.initName("Start");
- None.initName("None");
- Before.initName("Before");
- Nat1.initInt(1);
- }
-
- ~AttributeDefaults() {
- Inline.free();
- LrTb.free();
- Normal.free();
- Distribute.free();
- off.free();
- Zero.free();
- Auto.free();
- Start.free();
- None.free();
- Before.free();
- Nat1.free();
- }
+ Object Inline = Object(objName, "Inline");
+ Object LrTb = Object(objName, "LrTb");
+ Object Normal = Object(objName, "Normal");
+ Object Distribute = Object(objName, "Distribute");
+ Object off = Object(objName, "off");
+ Object Zero = Object(0.0);
+ Object Auto = Object(objName, "Auto");
+ Object Start = Object(objName, "Start");
+ Object None = Object(objName, "None");
+ Object Before = Object(objName, "Before");
+ Object Nat1 = Object(1);
};
static const AttributeDefaults attributeDefaults;
@@ -704,7 +669,7 @@
formatted(NULL)
{
assert(valueA);
- valueA->copy(&value);
+ value = valueA->copy();
}
Attribute::Attribute(Type type, Object *valueA):
@@ -718,7 +683,7 @@
{
assert(valueA);
- valueA->copy(&value);
+ value = valueA->copy();
if (!checkType())
type = Unknown;
@@ -727,7 +692,6 @@
Attribute::~Attribute()
{
delete formatted;
- value.free();
}
const char *Attribute::getTypeName() const
@@ -805,10 +769,11 @@
Attribute *Attribute::parseUserProperty(Dict *property)
{
Object obj, value;
- const char *name = NULL;
+ const char *name = nullptr;
int nameLen = GooString::CALC_STRING_LEN;
- if (property->lookup("N", &obj)->isString()) {
+ obj = property->lookup("N");
+ if (obj.isString()) {
GooString *s = obj.getString();
name = s->getCString();
nameLen = s->getLength();
@@ -816,34 +781,29 @@
name = obj.getName();
else {
error(errSyntaxError, -1, "N object is wrong type ({0:s})", obj.getTypeName());
- obj.free();
- return NULL;
+ return nullptr;
}
- if (property->lookup("V", &value)->isNull()) {
+ value = property->lookup("V");
+ if (value.isNull()) {
error(errSyntaxError, -1, "V object is wrong type ({0:s})", value.getTypeName());
- value.free();
- obj.free();
- return NULL;
+ return nullptr;
}
Attribute *attribute = new Attribute(name, nameLen, &value);
- value.free();
- obj.free();
-
- if (property->lookup("F", &obj)->isString()) {
+ obj = property->lookup("F");
+ if (obj.isString()) {
attribute->setFormattedValue(obj.getString()->getCString());
} else if (!obj.isNull()) {
error(errSyntaxWarning, -1, "F object is wrong type ({0:s})", obj.getTypeName());
}
- obj.free();
- if (property->lookup("H", &obj)->isBool()) {
+ obj = property->lookup("H");
+ if (obj.isBool()) {
attribute->setHidden(obj.getBool());
} else if (!obj.isNull()) {
error(errSyntaxWarning, -1, "H object is wrong type ({0:s})", obj.getTypeName());
}
- obj.free();
return attribute;
}
@@ -871,7 +831,6 @@
delete id;
delete title;
delete language;
- parentRef.free();
for (ElemPtrArray::iterator i = elements.begin(); i != elements.end(); ++i) delete *i;
for (AttrPtrArray::iterator i = attributes.begin(); i != attributes.end(); ++i) delete *i;
}
@@ -919,7 +878,6 @@
delete c;
else
delete s;
- pageRef.free();
}
GBool StructElement::isBlock() const
@@ -1058,21 +1016,22 @@
return mcdev.getTextSpans();
}
-static StructElement::Type roleMapResolve(Dict *roleMap, const char *name, const char *curName, Object *resolved)
+static StructElement::Type roleMapResolve(Dict *roleMap, const char *name, const char *curName)
{
// Circular reference
if (curName && !strcmp(name, curName))
return StructElement::Unknown;
- if (roleMap->lookup(curName ? curName : name, resolved)->isName()) {
- StructElement::Type type = nameToType(resolved->getName());
+ Object resolved = roleMap->lookup(curName ? curName : name);
+ if (resolved.isName()) {
+ StructElement::Type type = nameToType(resolved.getName());
return type == StructElement::Unknown
- ? roleMapResolve(roleMap, name, resolved->getName(), resolved)
+ ? roleMapResolve(roleMap, name, resolved.getName())
: type;
}
- if (!resolved->isNull())
- error(errSyntaxWarning, -1, "RoleMap entry is wrong type ({0:s})", resolved->getTypeName());
+ if (!resolved.isNull())
+ error(errSyntaxWarning, -1, "RoleMap entry is wrong type ({0:s})", resolved.getTypeName());
return StructElement::Unknown;
}
@@ -1081,31 +1040,30 @@
Object obj;
// Type is optional, but if present must be StructElem
- if (!element->lookup("Type", &obj)->isNull() && !obj.isName("StructElem")) {
+ obj = element->lookup("Type");
+ if (!obj.isNull() && !obj.isName("StructElem")) {
error(errSyntaxError, -1, "Type of StructElem object is wrong");
- obj.free();
return;
}
- obj.free();
// Parent object reference (required).
- if (!element->lookupNF("P", &s->parentRef)->isRef()) {
+ s->parentRef = element->lookupNF("P");
+ if (!s->parentRef.isRef()) {
error(errSyntaxError, -1, "P object is wrong type ({0:s})", obj.getTypeName());
return;
}
// Check whether the S-type is valid for the top level
// element and create a node of the appropriate type.
- if (!element->lookup("S", &obj)->isName()) {
+ obj = element->lookup("S");
+ if (!obj.isName()) {
error(errSyntaxError, -1, "S object is wrong type ({0:s})", obj.getTypeName());
- obj.free();
return;
}
// Type name may not be standard, resolve through RoleMap first.
if (treeRoot->getRoleMap()) {
- Object resolvedName;
- type = roleMapResolve(treeRoot->getRoleMap(), obj.getName(), NULL, &resolvedName);
+ type = roleMapResolve(treeRoot->getRoleMap(), obj.getName(), NULL);
}
// Resolving through RoleMap may leave type as Unknown, e.g. for types
@@ -1116,67 +1074,66 @@
// At this point either the type name must have been resolved.
if (type == Unknown) {
error(errSyntaxError, -1, "StructElem object is wrong type ({0:s})", obj.getName());
- obj.free();
return;
}
- obj.free();
// Object ID (optional), to be looked at the IDTree in the tree root.
- if (element->lookup("ID", &obj)->isString()) {
+ obj = element->lookup("ID");
+ if (obj.isString()) {
s->id = obj.takeString();
}
- obj.free();
// Page reference (optional) in which at least one of the child items
// is to be rendered in. Note: each element stores only the /Pg value
// contained by it, and StructElement::getPageRef() may look in parent
// elements to find the page where an element belongs.
- element->lookupNF("Pg", &pageRef);
+ pageRef = element->lookupNF("Pg");
// Revision number (optional).
- if (element->lookup("R", &obj)->isInt()) {
+ obj = element->lookup("R");
+ if (obj.isInt()) {
s->revision = obj.getInt();
}
- obj.free();
// Element title (optional).
- if (element->lookup("T", &obj)->isString()) {
+ obj = element->lookup("T");
+ if (obj.isString()) {
s->title = obj.takeString();
}
- obj.free();
// Language (optional).
- if (element->lookup("Lang", &obj)->isString()) {
+ obj = element->lookup("Lang");
+ if (obj.isString()) {
s->language = obj.takeString();
}
- obj.free();
// Alternative text (optional).
- if (element->lookup("Alt", &obj)->isString()) {
+ obj = element->lookup("Alt");
+ if (obj.isString()) {
s->altText = obj.takeString();
}
- obj.free();
// Expanded form of an abbreviation (optional).
- if (element->lookup("E", &obj)->isString()) {
+ obj = element->lookup("E");
+ if (obj.isString()) {
s->expandedAbbr = obj.takeString();
}
- obj.free();
// Actual text (optional).
- if (element->lookup("ActualText", &obj)->isString()) {
+ obj = element->lookup("ActualText");
+ if (obj.isString()) {
s->actualText = obj.takeString();
}
- obj.free();
// Attributes directly attached to the element (optional).
- if (element->lookup("A", &obj)->isDict()) {
+ obj = element->lookup("A");
+ if (obj.isDict()) {
parseAttributes(obj.getDict());
} else if (obj.isArray()) {
- Object iobj;
unsigned attrIndex = getNumAttributes();
for (int i = 0; i < obj.arrayGetLength(); i++) {
- if (obj.arrayGet(i, &iobj)->isDict()) {
+ Object iobj = obj.arrayGet(i);
+ if (iobj.isDict()) {
attrIndex = getNumAttributes();
parseAttributes(iobj.getDict());
} else if (iobj.isInt()) {
@@ -1187,25 +1144,23 @@
} else {
error(errSyntaxWarning, -1, "A item is wrong type ({0:s})", iobj.getTypeName());
}
- iobj.free();
}
} else if (!obj.isNull()) {
error(errSyntaxWarning, -1, "A is wrong type ({0:s})", obj.getTypeName());
}
- obj.free();
// Attributes referenced indirectly through the ClassMap (optional).
if (treeRoot->getClassMap()) {
- Object classes;
- if (element->lookup("C", &classes)->isName()) {
- Object attr;
- if (treeRoot->getClassMap()->lookup(classes.getName(), &attr)->isDict()) {
+ Object classes = element->lookup("C");
+ if (classes.isName()) {
+ Object attr = treeRoot->getClassMap()->lookup(classes.getName());
+ if (attr.isDict()) {
parseAttributes(attr.getDict(), gTrue);
} else if (attr.isArray()) {
for (int i = 0; i < attr.arrayGetLength(); i++) {
- Object iobj;
unsigned attrIndex = getNumAttributes();
- if (attr.arrayGet(i, &iobj)->isDict()) {
+ Object iobj = attr.arrayGet(i);
+ if (iobj.isDict()) {
attrIndex = getNumAttributes();
parseAttributes(iobj.getDict(), gTrue);
} else if (iobj.isInt()) {
@@ -1216,13 +1171,10 @@
} else {
error(errSyntaxWarning, -1, "C item is wrong type ({0:s})", iobj.getTypeName());
}
- iobj.free();
}
} else if (!attr.isNull()) {
error(errSyntaxWarning, -1, "C object is wrong type ({0:s})", classes.getTypeName());
}
- classes.free();
- attr.free();
}
}
}
@@ -1243,40 +1195,31 @@
* TODO: The optional Stm/StwOwn attributes are not handled, so all the
* page will be always scanned when calling StructElement::getText().
*/
- Object mcidObj;
- Object pageRefObj;
-
- if (!childObj->dictLookup("MCID", &mcidObj)->isInt()) {
+ Object mcidObj = childObj->dictLookup("MCID");
+ if (mcidObj.isInt()) {
error(errSyntaxError, -1, "MCID object is wrong type ({0:s})", mcidObj.getTypeName());
- mcidObj.free();
return NULL;
}
child = new StructElement(mcidObj.getInt(), treeRoot, this);
- mcidObj.free();
- if (childObj->dictLookupNF("Pg", &pageRefObj)->isRef()) {
- child->pageRef = pageRefObj;
- } else {
- pageRefObj.free();
+ Object pageRefObj = childObj->dictLookupNF("Pg");
+ if (pageRefObj.isRef()) {
+ child->pageRef = std::move(pageRefObj);
}
} else if (childObj->isDict("OBJR")) {
- Object refObj;
-
- if (childObj->dictLookupNF("Obj", &refObj)->isRef()) {
- Object pageRefObj;
+ Object refObj = childObj->dictLookupNF("Obj");
+ if (refObj.isRef()) {
child = new StructElement(refObj.getRef(), treeRoot, this);
- if (childObj->dictLookupNF("Pg", &pageRefObj)->isRef()) {
- child->pageRef = pageRefObj;
- } else {
- pageRefObj.free();
+ Object pageRefObj = childObj->dictLookupNF("Pg");
+ if (pageRefObj.isRef()) {
+ child->pageRef = std::move(pageRefObj);
}
} else {
error(errSyntaxError, -1, "Obj object is wrong type ({0:s})", refObj.getTypeName());
}
- refObj.free();
} else if (childObj->isDict()) {
if (!ref->isRef()) {
error(errSyntaxError, -1,
@@ -1310,34 +1253,29 @@
void StructElement::parseChildren(Dict *element, std::set<int> &seen)
{
- Object kids;
-
- if (element->lookup("K", &kids)->isArray()) {
+ Object kids = element->lookup("K");
+ if (kids.isArray()) {
for (int i = 0; i < kids.arrayGetLength(); i++) {
- Object obj, ref;
- parseChild(kids.arrayGetNF(i, &ref), kids.arrayGet(i, &obj), seen);
- obj.free();
- ref.free();
+ Object obj = kids.arrayGet(i);
+ Object ref = kids.arrayGetNF(i);
+ parseChild(&ref, &obj, seen);
}
} else if (kids.isDict() || kids.isInt()) {
- Object ref;
- parseChild(element->lookupNF("K", &ref), &kids, seen);
- ref.free();
+ Object ref = element->lookupNF("K");
+ parseChild(&ref, &kids, seen);
}
-
- kids.free();
}
void StructElement::parseAttributes(Dict *attributes, GBool keepExisting)
{
- Object owner;
- if (attributes->lookup("O", &owner)->isName("UserProperties")) {
+ Object owner = attributes->lookup("O");
+ if (owner.isName("UserProperties")) {
// In this case /P is an array of UserProperty dictionaries
- Object userProperties;
- if (attributes->lookup("P", &userProperties)->isArray()) {
+ Object userProperties = attributes->lookup("P");
+ if (userProperties.isArray()) {
for (int i = 0; i < userProperties.arrayGetLength(); i++) {
- Object property;
- if (userProperties.arrayGet(i, &property)->isDict()) {
+ Object property = userProperties.arrayGet(i);
+ if (property.isDict()) {
Attribute *attribute = Attribute::parseUserProperty(property.getDict());
if (attribute && attribute->isOk()) {
appendAttribute(attribute);
@@ -1348,10 +1286,8 @@
} else {
error(errSyntaxWarning, -1, "Item in P is wrong type ({0:s})", property.getTypeName());
}
- property.free();
}
}
- userProperties.free();
} else if (owner.isName()) {
// In this case /P contains standard attributes.
// Check first if the owner is a valid standard one.
@@ -1378,10 +1314,9 @@
}
if (type != Attribute::Unknown) {
- Object value;
+ Object value = attributes->getVal(i);
GBool typeCheckOk = gTrue;
- Attribute *attribute = new Attribute(type, attributes->getVal(i, &value));
- value.free();
+ Attribute *attribute = new Attribute(type, &value);
if (attribute->isOk() && (typeCheckOk = attribute->checkType(this))) {
appendAttribute(attribute);
@@ -1405,5 +1340,4 @@
} else if (!owner.isNull()) {
error(errSyntaxWarning, -1, "O is wrong type ({0:s})", owner.getTypeName());
}
- owner.free();
}
diff --git a/poppler/StructTreeRoot.cc b/poppler/StructTreeRoot.cc
index b557e3a..b8c52c6 100644
--- a/poppler/StructTreeRoot.cc
+++ b/poppler/StructTreeRoot.cc
@@ -7,6 +7,7 @@
// Copyright 2013, 2014 Igalia S.L.
// Copyright 2014 Fabio D'Urso <fabiodurso@hotmail.it>
// Copyright 2017 Jan-Erik S <janerik234678@gmail.com>
+// Copyright 2017 Albert Astals Cid <aacid@kde.org>
//
//========================================================================
@@ -36,8 +37,6 @@
{
for (ElemPtrArray::iterator i = elements.begin(); i != elements.end(); ++i)
delete *i;
- classMap.free();
- roleMap.free();
}
void StructTreeRoot::parse(Dict *root)
@@ -45,55 +44,53 @@
// The RoleMap/ClassMap dictionaries are needed by all the parsing
// functions, which will resolve the custom names to canonical
// standard names.
- root->lookup("RoleMap", &roleMap);
- root->lookup("ClassMap", &classMap);
+ roleMap = root->lookup("RoleMap");
+ classMap = root->lookup("ClassMap");
// ParentTree (optional). If present, it must be a number tree,
// otherwise it is not possible to map stream objects to their
// corresponsing structure element. Here only the references are
// loaded into the array, the pointers to the StructElements will
// be filled-in later when parsing them.
- Object obj;
- if (root->lookup("ParentTree", &obj)->isDict()) {
- Object nums;
- if (obj.dictLookup("Nums", &nums)->isArray()) {
+ Object obj = root->lookup("ParentTree");
+ if (obj.isDict()) {
+ Object nums = obj.dictLookup("Nums");
+ if (nums.isArray()) {
if (nums.arrayGetLength() % 2 == 0) {
parentTree.resize(nums.arrayGetLength() / 2);
// Index numbers in even positions, references in odd ones
for (int i = 0; i < nums.arrayGetLength(); i += 2) {
- Object index, value;
+ Object index = nums.arrayGet(i);
- if (!nums.arrayGet(i, &index)->isInt()) {
+ if (!index.isInt()) {
error(errSyntaxError, -1, "Nums item at position {0:d} is wrong type ({1:s})", i, index.getTypeName());
- index.free();
continue;
}
const unsigned idx = index.getInt();
if (idx < 0 || idx >= parentTree.size()) {
error(errSyntaxError, -1, "Nums item at position {0:d} is invalid value ({1:d}): [0..{2:d}]", i, idx, parentTree.size() - 1);
- index.free();
continue;
}
- if (nums.arrayGetNF(i + 1, &value)->isRef()) {
+ Object value = nums.arrayGetNF(i + 1);
+ if (value.isRef()) {
parentTree[idx].resize(1);
parentTree[idx][0].ref = value.getRef();
- } else if (nums.arrayGet(i + 1, &value)->isArray()) {
- parentTree[idx].resize(value.arrayGetLength());
- for (int j = 0; j < value.arrayGetLength(); j++) {
- Object itemvalue;
- if (value.arrayGetNF(j, &itemvalue)->isRef())
- parentTree[idx][j].ref = itemvalue.getRef();
- else
- error(errSyntaxError, -1, "Nums array item at position {0:d}/{1:d} is invalid type ({2:s})", i, j, itemvalue.getTypeName());
- itemvalue.free();
- }
} else {
- error(errSyntaxError, -1, "Nums item at position {0:d} is wrong type ({1:s})", i + 1, value.getTypeName());
- }
-
- value.free();
- index.free();
+ value = nums.arrayGet(i + 1);
+ if (value.isArray()) {
+ parentTree[idx].resize(value.arrayGetLength());
+ for (int j = 0; j < value.arrayGetLength(); j++) {
+ Object itemvalue = value.arrayGetNF(j);
+ if (itemvalue.isRef())
+ parentTree[idx][j].ref = itemvalue.getRef();
+ else
+ error(errSyntaxError, -1, "Nums array item at position {0:d}/{1:d} is invalid type ({2:s})", i, j, itemvalue.getTypeName());
+ }
+ } else {
+ error(errSyntaxError, -1, "Nums item at position {0:d} is wrong type ({1:s})", i + 1, value.getTypeName());
+ }
+ }
}
} else {
error(errSyntaxError, -1, "Nums array length is not a even ({0:d})", nums.arrayGetLength());
@@ -101,26 +98,24 @@
} else {
error(errSyntaxError, -1, "Nums object is wrong type ({0:s})", nums.getTypeName());
}
- nums.free();
}
- obj.free();
std::set<int> seenElements;
// Parse the children StructElements
const GBool marked = doc->getCatalog()->getMarkInfo() & Catalog::markInfoMarked;
- Object kids;
- if (root->lookup("K", &kids)->isArray()) {
+ Object kids = root->lookup("K");
+ if (kids.isArray()) {
if (marked && kids.arrayGetLength() > 1) {
error(errSyntaxWarning, -1, "K in StructTreeRoot has more than one children in a tagged PDF");
}
for (int i = 0; i < kids.arrayGetLength(); i++) {
- Object obj, ref;
- kids.arrayGetNF(i, &ref);
+ Object ref = kids.arrayGetNF(i);
if (ref.isRef()) {
seenElements.insert(ref.getRefNum());
}
- if (kids.arrayGet(i, &obj)->isDict()) {
+ Object obj = kids.arrayGet(i);
+ if (obj.isDict()) {
StructElement *child = new StructElement(obj.getDict(), this, NULL, seenElements);
if (child->isOk()) {
if (marked && !(child->getType() == StructElement::Document ||
@@ -140,8 +135,6 @@
} else {
error(errSyntaxWarning, -1, "K has a child of wrong type ({0:s})", obj.getTypeName());
}
- obj.free();
- ref.free();
}
} else if (kids.isDict()) {
if (marked) {
@@ -150,10 +143,9 @@
StructElement *child = new StructElement(kids.getDict(), this, NULL, seenElements);
if (child->isOk()) {
appendChild(child);
- Object ref;
- if (root->lookupNF("K", &ref)->isRef())
+ Object ref = root->lookupNF("K");
+ if (ref.isRef())
parentTreeAdd(ref.getRef(), child);
- ref.free();
} else {
error(errSyntaxWarning, -1, "StructTreeRoot element could not be parsed");
delete child;
@@ -161,8 +153,6 @@
} else if (!kids.isNull()) {
error(errSyntaxWarning, -1, "K in StructTreeRoot is wrong type ({0:s})", kids.getTypeName());
}
-
- kids.free();
}
void StructTreeRoot::parentTreeAdd(const Ref &objectRef, StructElement *element)
diff --git a/poppler/TextOutputDev.cc b/poppler/TextOutputDev.cc
index d9993e9..a89ba23 100644
--- a/poppler/TextOutputDev.cc
+++ b/poppler/TextOutputDev.cc
@@ -20,7 +20,7 @@
// Copyright (C) 2006 Jeff Muizelaar <jeff@infidigm.net>
// Copyright (C) 2007, 2008, 2012 Adrian Johnson <ajohnson@redneon.com>
// Copyright (C) 2008 Koji Otani <sho@bbr.jp>
-// Copyright (C) 2008, 2010-2012, 2014-2016 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2008, 2010-2012, 2014-2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2008 Pino Toscano <pino@kde.org>
// Copyright (C) 2008, 2010 Hib Eris <hib@hiberis.nl>
// Copyright (C) 2009 Ross Moore <ross@maths.mq.edu.au>
@@ -891,6 +891,7 @@
// expand the array if needed
if (unlikely((word->base / textPoolStep) > INT_MAX)) {
error(errSyntaxWarning, -1, "word->base / textPoolStep > INT_MAX");
+ delete word;
return;
}
wordBaseIdx = (int)(word->base / textPoolStep);
diff --git a/poppler/ViewerPreferences.cc b/poppler/ViewerPreferences.cc
index cba8d0a..e45134f 100644
--- a/poppler/ViewerPreferences.cc
+++ b/poppler/ViewerPreferences.cc
@@ -5,6 +5,7 @@
// This file is licensed under the GPLv2 or later
//
// Copyright 2011 Pino Toscano <pino@kde.org>
+// Copyright 2017 Albert Astals Cid <aacid@kde.org>
//
//========================================================================
@@ -19,39 +20,38 @@
{
init();
- Object obj;
-
- if (prefDict->lookup("HideToolbar", &obj)->isBool()) {
+ Object obj = prefDict->lookup("HideToolbar");
+ if (obj.isBool()) {
hideToolbar = obj.getBool();
}
- obj.free();
- if (prefDict->lookup("HideMenubar", &obj)->isBool()) {
+ obj = prefDict->lookup("HideMenubar");
+ if (obj.isBool()) {
hideMenubar = obj.getBool();
}
- obj.free();
- if (prefDict->lookup("HideWindowUI", &obj)->isBool()) {
+ obj = prefDict->lookup("HideWindowUI");
+ if (obj.isBool()) {
hideWindowUI = obj.getBool();
}
- obj.free();
- if (prefDict->lookup("FitWindow", &obj)->isBool()) {
+ obj = prefDict->lookup("FitWindow");
+ if (obj.isBool()) {
fitWindow = obj.getBool();
}
- obj.free();
- if (prefDict->lookup("CenterWindow", &obj)->isBool()) {
+ obj = prefDict->lookup("CenterWindow");
+ if (obj.isBool()) {
centerWindow = obj.getBool();
}
- obj.free();
- if (prefDict->lookup("DisplayDocTitle", &obj)->isBool()) {
+ obj = prefDict->lookup("DisplayDocTitle");
+ if (obj.isBool()) {
displayDocTitle = obj.getBool();
}
- obj.free();
- if (prefDict->lookup("NonFullScreenPageMode", &obj)->isName()) {
+ obj = prefDict->lookup("NonFullScreenPageMode");
+ if (obj.isName()) {
const char *mode = obj.getName();
if (!strcmp(mode, "UseNone")) {
nonFullScreenPageMode = nfpmUseNone;
@@ -63,9 +63,9 @@
nonFullScreenPageMode = nfpmUseOC;
}
}
- obj.free();
- if (prefDict->lookup("Direction", &obj)->isName()) {
+ obj = prefDict->lookup("Direction");
+ if (obj.isName()) {
const char *dir = obj.getName();
if (!strcmp(dir, "L2R")) {
direction = directionL2R;
@@ -73,9 +73,9 @@
direction = directionR2L;
}
}
- obj.free();
- if (prefDict->lookup("PrintScaling", &obj)->isName()) {
+ obj = prefDict->lookup("PrintScaling");
+ if (obj.isName()) {
const char *ps = obj.getName();
if (!strcmp(ps, "None")) {
printScaling = printScalingNone;
@@ -83,9 +83,9 @@
printScaling = printScalingAppDefault;
}
}
- obj.free();
- if (prefDict->lookup("Duplex", &obj)->isName()) {
+ obj = prefDict->lookup("Duplex");
+ if (obj.isName()) {
const char *d = obj.getName();
if (!strcmp(d, "Simplex")) {
duplex = duplexSimplex;
@@ -95,7 +95,6 @@
duplex = duplexDuplexFlipLongEdge;
}
}
- obj.free();
}
ViewerPreferences::~ViewerPreferences()
diff --git a/poppler/XRef.cc b/poppler/XRef.cc
index 6ea0fbb..1052601 100644
--- a/poppler/XRef.cc
+++ b/poppler/XRef.cc
@@ -99,7 +99,7 @@
// Get the <objIdx>th object from this stream, which should be
// object number <objNum>, generation 0.
- Object *getObject(int objIdx, int objNum, Object *obj);
+ Object getObject(int objIdx, int objNum);
private:
@@ -145,7 +145,7 @@
Stream *str;
Parser *parser;
Goffset *offsets;
- Object objStr, obj1, obj2;
+ Object objStr, obj1;
Goffset first;
int i;
@@ -155,32 +155,30 @@
objNums = NULL;
ok = gFalse;
- if (!xref->fetch(objStrNum, 0, &objStr, recursion)->isStream()) {
- goto err1;
+ objStr = xref->fetch(objStrNum, 0, recursion);
+ if (!objStr.isStream()) {
+ return;
}
- if (!objStr.streamGetDict()->lookup("N", &obj1, recursion)->isInt()) {
- obj1.free();
- goto err1;
+ obj1 = objStr.streamGetDict()->lookup("N", recursion);
+ if (!obj1.isInt()) {
+ return;
}
nObjects = obj1.getInt();
- obj1.free();
if (nObjects <= 0) {
- goto err1;
+ return;
}
- objStr.streamGetDict()->lookup("First", &obj1, recursion);
+ obj1 = objStr.streamGetDict()->lookup("First", recursion);
if (!obj1.isInt() && !obj1.isInt64()) {
- obj1.free();
- goto err1;
+ return;
}
if (obj1.isInt())
first = obj1.getInt();
else
first = obj1.getInt64();
- obj1.free();
if (first < 0) {
- goto err1;
+ return;
}
// this is an arbitrary limit to avoid integer overflow problems
@@ -188,7 +186,7 @@
// object streams to 100-200 objects)
if (nObjects > 1000000) {
error(errSyntaxError, -1, "Too many objects in an object stream");
- goto err1;
+ return;
}
objs = new Object[nObjects];
objNums = (int *)gmallocn(nObjects, sizeof(int));
@@ -196,31 +194,26 @@
// parse the header: object numbers and offsets
objStr.streamReset();
- obj1.initNull();
- str = new EmbedStream(objStr.getStream(), &obj1, gTrue, first);
+ str = new EmbedStream(objStr.getStream(), Object(objNull), gTrue, first);
parser = new Parser(xref, new Lexer(xref, str), gFalse);
for (i = 0; i < nObjects; ++i) {
- parser->getObj(&obj1);
- parser->getObj(&obj2);
+ obj1 = parser->getObj();
+ Object obj2 = parser->getObj();
if (!obj1.isInt() || !(obj2.isInt() || obj2.isInt64())) {
- obj1.free();
- obj2.free();
delete parser;
gfree(offsets);
- goto err1;
+ return;
}
objNums[i] = obj1.getInt();
if (obj2.isInt())
offsets[i] = obj2.getInt();
else
offsets[i] = obj2.getInt64();
- obj1.free();
- obj2.free();
if (objNums[i] < 0 || offsets[i] < 0 ||
(i > 0 && offsets[i] < offsets[i-1])) {
delete parser;
gfree(offsets);
- goto err1;
+ return;
}
}
while (str->getChar() != EOF) ;
@@ -235,43 +228,32 @@
// parse the objects
for (i = 0; i < nObjects; ++i) {
- obj1.initNull();
if (i == nObjects - 1) {
- str = new EmbedStream(objStr.getStream(), &obj1, gFalse, 0);
+ str = new EmbedStream(objStr.getStream(), Object(objNull), gFalse, 0);
} else {
- str = new EmbedStream(objStr.getStream(), &obj1, gTrue,
+ str = new EmbedStream(objStr.getStream(), Object(objNull), gTrue,
offsets[i+1] - offsets[i]);
}
parser = new Parser(xref, new Lexer(xref, str), gFalse);
- parser->getObj(&objs[i]);
+ objs[i] = parser->getObj();
while (str->getChar() != EOF) ;
delete parser;
}
gfree(offsets);
ok = gTrue;
-
- err1:
- objStr.free();
}
ObjectStream::~ObjectStream() {
- int i;
-
- if (objs) {
- for (i = 0; i < nObjects; ++i) {
- objs[i].free();
- }
- delete[] objs;
- }
+ delete[] objs;
gfree(objNums);
}
-Object *ObjectStream::getObject(int objIdx, int objNum, Object *obj) {
+Object ObjectStream::getObject(int objIdx, int objNum) {
if (objIdx < 0 || objIdx >= nObjects || objNum != objNums[objIdx]) {
- return obj->initNull();
+ return Object(objNull);
}
- return objs[objIdx].copy(obj);
+ return objs[objIdx].copy();
}
//------------------------------------------------------------------------
@@ -311,7 +293,7 @@
init();
if (trailerDictA->isDict())
- trailerDict.initDict(trailerDictA->getDict());
+ trailerDict = trailerDictA->copy();
}
XRef::XRef(BaseStream *strA, Goffset pos, Goffset mainXRefEntriesOffsetA, GBool *wasReconstructed, GBool reconstruct) {
@@ -356,30 +338,26 @@
}
// set size to (at least) the size specified in trailer dict
- trailerDict.dictLookupNF("Size", &obj);
+ obj = trailerDict.dictLookupNF("Size");
if (!obj.isInt()) {
error(errSyntaxWarning, -1, "No valid XRef size in trailer");
} else {
if (obj.getInt() > size) {
if (resize(obj.getInt()) != obj.getInt()) {
if (!(ok = constructXRef(wasReconstructed))) {
- obj.free();
errCode = errDamaged;
return;
}
}
}
}
- obj.free();
// get the root dictionary (catalog) object
- trailerDict.dictLookupNF("Root", &obj);
+ obj = trailerDict.dictLookupNF("Root");
if (obj.isRef()) {
rootNum = obj.getRefNum();
rootGen = obj.getRefGen();
- obj.free();
} else {
- obj.free();
if (!(ok = constructXRef(wasReconstructed))) {
errCode = errDamaged;
return;
@@ -397,7 +375,6 @@
}
gfree(entries);
- trailerDict.free();
if (streamEnds) {
gfree(streamEnds);
}
@@ -426,7 +403,7 @@
xref->prevXRefOffset = prevXRefOffset;
xref->mainXRefEntriesOffset = mainXRefEntriesOffset;
xref->xRefStream = xRefStream;
- trailerDict.copy(&xref->trailerDict);
+ xref->trailerDict = trailerDict.copy();
xref->encAlgorithm = encAlgorithm;
xref->encRevision = encRevision;
xref->encVersion = encVersion;
@@ -446,7 +423,7 @@
for (int i = 0; i < size; ++i) {
xref->entries[i].offset = entries[i].offset;
xref->entries[i].type = entries[i].type;
- xref->entries[i].obj.initNull ();
+ xref->entries[i].obj.setToNull();
xref->entries[i].flags = entries[i].flags;
xref->entries[i].gen = entries[i].gen;
}
@@ -495,7 +472,7 @@
for (int i = size; i < newSize; ++i) {
entries[i].offset = -1;
entries[i].type = xrefEntryNone;
- entries[i].obj.initNull ();
+ entries[i].obj.initNullAfterMalloc ();
entries[i].flags = 0;
entries[i].gen = 0;
}
@@ -529,31 +506,26 @@
GBool more;
// start up a parser, parse one token
- obj.initNull();
parser = new Parser(NULL,
new Lexer(NULL,
- str->makeSubStream(start + *pos, gFalse, 0, &obj)),
+ str->makeSubStream(start + *pos, gFalse, 0, Object(objNull))),
gTrue);
- parser->getObj(&obj, gTrue);
+ obj = parser->getObj(gTrue);
// parse an old-style xref table
if (obj.isCmd("xref")) {
- obj.free();
more = readXRefTable(parser, pos, followedXRefStm, xrefStreamObjsNum);
// parse an xref stream
} else if (obj.isInt()) {
const int objNum = obj.getInt();
- obj.free();
- if (!parser->getObj(&obj, gTrue)->isInt()) {
+ if (obj = parser->getObj(gTrue), !obj.isInt()) {
goto err1;
}
- obj.free();
- if (!parser->getObj(&obj, gTrue)->isCmd("obj")) {
+ if (obj = parser->getObj(gTrue), !obj.isCmd("obj")) {
goto err1;
}
- obj.free();
- if (!parser->getObj(&obj)->isStream()) {
+ if (obj = parser->getObj(), !obj.isStream()) {
goto err1;
}
if (trailerDict.isNone()) {
@@ -563,7 +535,6 @@
xrefStreamObjsNum->push_back(objNum);
}
more = readXRefStream(obj.getStream(), pos);
- obj.free();
} else {
goto err1;
@@ -573,7 +544,6 @@
return more;
err1:
- obj.free();
delete parser;
ok = gFalse;
return gFalse;
@@ -587,21 +557,19 @@
int first, n, i;
while (1) {
- parser->getObj(&obj, gTrue);
+ obj = parser->getObj(gTrue);
if (obj.isCmd("trailer")) {
- obj.free();
break;
}
if (!obj.isInt()) {
- goto err1;
+ goto err0;
}
first = obj.getInt();
- obj.free();
- if (!parser->getObj(&obj, gTrue)->isInt()) {
- goto err1;
+ obj = parser->getObj(gTrue);
+ if (!obj.isInt()) {
+ goto err0;
}
n = obj.getInt();
- obj.free();
if (first < 0 || n < 0 || first + n < 0) {
goto err0;
}
@@ -612,33 +580,35 @@
}
}
for (i = first; i < first + n; ++i) {
- parser->getObj(&obj, gTrue);
+ obj = parser->getObj(gTrue);
if (obj.isInt()) {
entry.offset = obj.getInt();
} else if (obj.isInt64()) {
entry.offset = obj.getInt64();
} else {
- goto err1;
+ goto err0;
}
- obj.free();
- if (!parser->getObj(&obj, gTrue)->isInt()) {
- goto err1;
+ obj = parser->getObj(gTrue);
+ if (!obj.isInt()) {
+ goto err0;
}
entry.gen = obj.getInt();
- entry.obj.initNull ();
entry.flags = 0;
- obj.free();
- parser->getObj(&obj, gTrue);
+ obj = parser->getObj(gTrue);
if (obj.isCmd("n")) {
entry.type = xrefEntryUncompressed;
} else if (obj.isCmd("f")) {
entry.type = xrefEntryFree;
} else {
- goto err1;
+ goto err0;
}
- obj.free();
if (entries[i].offset == -1) {
- entries[i] = entry;
+ entries[i].offset = entry.offset;
+ entries[i].gen = entry.gen;
+ entries[i].type = entry.type;
+ entries[i].flags = entry.flags;
+ entries[i].obj.setToNull();
+
// PDF files of patents from the IBM Intellectual Property
// Network have a bug: the xref table claims to start at 1
// instead of 0.
@@ -646,7 +616,12 @@
entries[1].offset == 0 && entries[1].gen == 65535 &&
entries[1].type == xrefEntryFree) {
i = first = 0;
- entries[0] = entries[1];
+ entries[0].offset = 0;
+ entries[0].gen = 65535;
+ entries[0].type = xrefEntryFree;
+ entries[0].flags = entries[1].flags;
+ entries[0].obj = std::move(entries[1].obj);
+
entries[1].offset = -1;
}
}
@@ -654,12 +629,13 @@
}
// read the trailer dictionary
- if (!parser->getObj(&obj)->isDict()) {
- goto err1;
+ obj = parser->getObj();
+ if (!obj.isDict()) {
+ goto err0;
}
// get the 'Prev' pointer
- obj.getDict()->lookupNF("Prev", &obj2);
+ obj2 = obj.getDict()->lookupNF("Prev");
if (obj2.isInt() || obj2.isInt64()) {
if (obj2.isInt())
pos2 = obj2.getInt();
@@ -686,15 +662,14 @@
} else {
more = gFalse;
}
- obj2.free();
// save the first trailer dictionary
if (trailerDict.isNone()) {
- obj.copy(&trailerDict);
+ trailerDict = obj.copy();
}
// check for an 'XRefStm' key
- obj.getDict()->lookup("XRefStm", &obj2);
+ obj2 = obj.getDict()->lookup("XRefStm");
if (obj2.isInt() || obj2.isInt64()) {
if (obj2.isInt())
pos2 = obj2.getInt();
@@ -710,97 +685,84 @@
readXRef(&pos2, followedXRefStm, xrefStreamObjsNum);
}
if (!ok) {
- obj2.free();
- goto err1;
+ goto err0;
}
}
- obj2.free();
- obj.free();
return more;
- err1:
- obj.free();
err0:
ok = gFalse;
return gFalse;
}
GBool XRef::readXRefStream(Stream *xrefStr, Goffset *pos) {
- Dict *dict;
int w[3];
GBool more;
- Object obj, obj2, idx;
- int newSize, first, n, i;
+ Object obj;
- dict = xrefStr->getDict();
+ ok = gFalse;
- if (!dict->lookupNF("Size", &obj)->isInt()) {
- goto err1;
+ Dict *dict = xrefStr->getDict();
+ obj = dict->lookupNF("Size");
+ if (!obj.isInt()) {
+ return gFalse;
}
- newSize = obj.getInt();
- obj.free();
+ int newSize = obj.getInt();
if (newSize < 0) {
- goto err1;
+ return gFalse;
}
if (newSize > size) {
if (resize(newSize) != newSize) {
error(errSyntaxError, -1, "Invalid 'size' parameter");
- goto err0;
+ return gFalse;
}
}
- if (!dict->lookupNF("W", &obj)->isArray() ||
- obj.arrayGetLength() < 3) {
- goto err1;
+ obj = dict->lookupNF("W");
+ if (!obj.isArray() || obj.arrayGetLength() < 3) {
+ return gFalse;
}
- for (i = 0; i < 3; ++i) {
- if (!obj.arrayGet(i, &obj2)->isInt()) {
- obj2.free();
- goto err1;
+ for (int i = 0; i < 3; ++i) {
+ Object obj2 = obj.arrayGet(i);
+ if (!obj2.isInt()) {
+ return gFalse;
}
w[i] = obj2.getInt();
- obj2.free();
if (w[i] < 0) {
- goto err1;
+ return gFalse;
}
}
- obj.free();
if (w[0] > (int)sizeof(int) || w[1] > (int)sizeof(long long) || w[2] > (int)sizeof(int)) {
- goto err1;
+ return gFalse;
}
xrefStr->reset();
- dict->lookupNF("Index", &idx);
+ Object idx = dict->lookupNF("Index");
if (idx.isArray()) {
- for (i = 0; i+1 < idx.arrayGetLength(); i += 2) {
- if (!idx.arrayGet(i, &obj)->isInt()) {
- idx.free();
- goto err1;
+ for (int i = 0; i+1 < idx.arrayGetLength(); i += 2) {
+ obj = idx.arrayGet(i);
+ if (!obj.isInt()) {
+ return gFalse;
}
- first = obj.getInt();
- obj.free();
- if (!idx.arrayGet(i+1, &obj)->isInt()) {
- idx.free();
- goto err1;
+ int first = obj.getInt();
+ obj = idx.arrayGet(i+1);
+ if (!obj.isInt()) {
+ return gFalse;
}
- n = obj.getInt();
- obj.free();
+ int n = obj.getInt();
if (first < 0 || n < 0 ||
!readXRefStreamSection(xrefStr, w, first, n)) {
- idx.free();
- goto err0;
+ return gFalse;
}
}
} else {
if (!readXRefStreamSection(xrefStr, w, 0, newSize)) {
- idx.free();
- goto err0;
+ return gFalse;
}
}
- idx.free();
- dict->lookupNF("Prev", &obj);
+ obj = dict->lookupNF("Prev");
if (obj.isInt()) {
*pos = obj.getInt();
more = gTrue;
@@ -810,18 +772,12 @@
} else {
more = gFalse;
}
- obj.free();
if (trailerDict.isNone()) {
- trailerDict.initDict(dict);
+ trailerDict = xrefStr->getDictObject()->copy();
}
+ ok = gTrue;
return more;
-
- err1:
- obj.free();
- err0:
- ok = gFalse;
- return gFalse;
}
GBool XRef::readXRefStreamSection(Stream *xrefStr, int *w, int first, int n) {
@@ -897,7 +853,7 @@
// Attempt to construct an xref table for a damaged file.
GBool XRef::constructXRef(GBool *wasReconstructed, GBool needCatalogDict) {
Parser *parser;
- Object newTrailerDict, obj;
+ Object obj;
char buf[256];
Goffset pos;
int num, gen;
@@ -909,6 +865,7 @@
bool oneCycle = true;
int offset = 0;
+ resize(0); // free entries properly
gfree(entries);
capacity = 0;
size = 0;
@@ -947,26 +904,20 @@
// got trailer dictionary
if (!strncmp(p, "trailer", 7)) {
- obj.initNull();
parser = new Parser(NULL,
new Lexer(NULL,
- str->makeSubStream(pos + 7, gFalse, 0, &obj)),
+ str->makeSubStream(pos + 7, gFalse, 0, Object(objNull))),
gFalse);
- parser->getObj(&newTrailerDict);
+ Object newTrailerDict = parser->getObj();
if (newTrailerDict.isDict()) {
- newTrailerDict.dictLookupNF("Root", &obj);
+ obj = newTrailerDict.dictLookupNF("Root");
if (obj.isRef() && (!gotRoot || !needCatalogDict) && rootNum != obj.getRefNum()) {
rootNum = obj.getRefNum();
rootGen = obj.getRefGen();
- if (!trailerDict.isNone()) {
- trailerDict.free();
- }
- newTrailerDict.copy(&trailerDict);
+ trailerDict = newTrailerDict.copy();
gotRoot = gTrue;
}
- obj.free();
}
- newTrailerDict.free();
delete parser;
// look for object
@@ -1143,20 +1094,19 @@
return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permAssemble);
}
-Object *XRef::getCatalog(Object *catalog) {
- fetch(rootNum, rootGen, catalog);
- if (catalog->isDict()) {
+Object XRef::getCatalog() {
+ Object catalog = fetch(rootNum, rootGen);
+ if (catalog.isDict()) {
return catalog;
}
GBool wasReconstructed = false;
if (constructXRef(&wasReconstructed, gTrue)) {
- catalog->free();
- fetch(rootNum, rootGen, catalog);
+ catalog = fetch(rootNum, rootGen);
}
return catalog;
}
-Object *XRef::fetch(int num, int gen, Object *obj, int recursion) {
+Object XRef::fetch(int num, int gen, int recursion) {
XRefEntry *e;
Parser *parser;
Object obj1, obj2, obj3;
@@ -1169,24 +1119,23 @@
e = getEntry(num);
if(!e->obj.isNull ()) { //check for updated object
- obj = e->obj.copy(obj);
- return obj;
+ return e->obj.copy();
}
switch (e->type) {
case xrefEntryUncompressed:
+ {
if (e->gen != gen) {
goto err;
}
- obj1.initNull();
parser = new Parser(this,
new Lexer(this,
- str->makeSubStream(start + e->offset, gFalse, 0, &obj1)),
+ str->makeSubStream(start + e->offset, gFalse, 0, Object(objNull))),
gTrue);
- parser->getObj(&obj1, recursion);
- parser->getObj(&obj2, recursion);
- parser->getObj(&obj3, recursion);
+ obj1 = parser->getObj(recursion);
+ obj2 = parser->getObj(recursion);
+ obj3 = parser->getObj(recursion);
if (!obj1.isInt() || obj1.getInt() != num ||
!obj2.isInt() || obj2.getInt() != gen ||
!obj3.isCmd("obj")) {
@@ -1205,28 +1154,19 @@
if (longNumber <= INT_MAX && longNumber >= INT_MIN && *end_ptr == '\0') {
int number = longNumber;
error(errSyntaxWarning, -1, "Cmd was not obj but {0:s}, assuming the creator meant obj {1:d}", cmd, number);
- obj->initInt(number);
- obj1.free();
- obj2.free();
- obj3.free();
delete parser;
- break;
+ return Object(number);
}
}
}
- obj1.free();
- obj2.free();
- obj3.free();
delete parser;
goto err;
}
- parser->getObj(obj, gFalse, (encrypted && !e->getFlag(XRefEntry::Unencrypted)) ? fileKey : NULL,
+ Object obj = parser->getObj(gFalse, (encrypted && !e->getFlag(XRefEntry::Unencrypted)) ? fileKey : NULL,
encAlgorithm, keyLength, num, gen, recursion);
- obj1.free();
- obj2.free();
- obj3.free();
delete parser;
- break;
+ return obj;
+ }
case xrefEntryCompressed:
{
@@ -1263,24 +1203,21 @@
objStrs->put(newkey, newitem);
}
}
- objStr->getObject(e->gen, num, obj);
+ return objStr->getObject(e->gen, num);
}
- break;
default:
goto err;
}
- return obj;
-
err:
if (!xRefStream && !xrefReconstructed) {
error(errInternal, -1, "xref num {0:d} not found but needed, try to reconstruct\n", num);
rootNum = -1;
constructXRef(&xrefReconstructed);
- return fetch(num, gen, obj, ++recursion);
+ return fetch(num, gen, ++recursion);
}
- return obj->initNull();
+ return Object(objNull);
}
void XRef::lock() {
@@ -1295,43 +1232,34 @@
#endif
}
-Object *XRef::getDocInfo(Object *obj) {
- return trailerDict.dictLookup("Info", obj);
+Object XRef::getDocInfo() {
+ return trailerDict.dictLookup("Info");
}
// Added for the pdftex project.
-Object *XRef::getDocInfoNF(Object *obj) {
- return trailerDict.dictLookupNF("Info", obj);
+Object XRef::getDocInfoNF() {
+ return trailerDict.dictLookupNF("Info");
}
-Object *XRef::createDocInfoIfNoneExists(Object *obj) {
- getDocInfo(obj);
+Object XRef::createDocInfoIfNoneExists() {
+ Object obj = getDocInfo();
- if (obj->isDict()) {
+ if (obj.isDict()) {
return obj;
- } else if (!obj->isNull()) {
+ } else if (!obj.isNull()) {
// DocInfo exists, but isn't a dictionary (doesn't comply with the PDF reference)
- obj->free();
removeDocInfo();
}
- obj->initDict(this);
-
- Ref ref = addIndirectObject(obj);
-
- Object objRef;
- objRef.initRef(ref.num, ref.gen);
-
- trailerDict.dictSet("Info", &objRef);
-
- objRef.free();
+ obj = Object(new Dict(this));
+ const Ref ref = addIndirectObject(&obj);
+ trailerDict.dictSet("Info", Object(ref.num, ref.gen));
return obj;
}
void XRef::removeDocInfo() {
- Object infoObjRef;
- getDocInfoNF(&infoObjRef);
+ Object infoObjRef = getDocInfoNF();
if (infoObjRef.isNull()) {
return;
}
@@ -1339,7 +1267,6 @@
trailerDict.dictRemove("Info");
removeIndirectObject(infoObjRef.getRef());
- infoObjRef.free();
}
GBool XRef::getStreamEnd(Goffset streamStart, Goffset *streamEnd) {
@@ -1396,7 +1323,7 @@
for (int i = size; i < num + 1; ++i) {
entries[i].offset = -1;
entries[i].type = xrefEntryFree;
- entries[i].obj.initNull ();
+ entries[i].obj.initNullAfterMalloc();
entries[i].flags = 0;
entries[i].gen = 0;
}
@@ -1404,7 +1331,7 @@
}
XRefEntry *e = getEntry(num);
e->gen = gen;
- e->obj.initNull ();
+ e->obj.setToNull();
e->flags = 0;
if (used) {
e->type = xrefEntryUncompressed;
@@ -1422,8 +1349,7 @@
return;
}
XRefEntry *e = getEntry(r.num);
- e->obj.free();
- o->copy(&(e->obj));
+ e->obj = o->copy();
e->setFlag(XRefEntry::Updated, gTrue);
setModified();
}
@@ -1449,7 +1375,7 @@
//incremented when the object was deleted
}
e->type = xrefEntryUncompressed;
- o->copy(&e->obj);
+ e->obj = o->copy();
e->setFlag(XRefEntry::Updated, gTrue);
setModified();
@@ -1538,16 +1464,15 @@
writeXRef(&writer, writeAllEntries);
}
-XRef::XRefStreamWriter::XRefStreamWriter(Object *indexA, GooString *stmBufA, int offsetSizeA) {
+XRef::XRefStreamWriter::XRefStreamWriter(Array *indexA, GooString *stmBufA, int offsetSizeA) {
index = indexA;
stmBuf = stmBufA;
offsetSize = offsetSizeA;
}
void XRef::XRefStreamWriter::startSection(int first, int count) {
- Object obj;
- index->arrayAdd( obj.initInt(first) );
- index->arrayAdd( obj.initInt(count) );
+ index->add( Object(first) );
+ index->add( Object(count) );
}
void XRef::XRefStreamWriter::writeEntry(Goffset offset, int gen, XRefEntryType type) {
@@ -1576,8 +1501,7 @@
}
void XRef::writeStreamToBuffer(GooString *stmBuf, Dict *xrefDict, XRef *xref) {
- Object index;
- index.initArray(xref);
+ Array *index = new Array(xref);
stmBuf->clear();
// First pass: determine whether all offsets fit in 4 bytes or not
@@ -1586,47 +1510,41 @@
const int offsetSize = prescan.hasOffsetsBeyond4GB ? sizeof(Goffset) : 4;
// Second pass: actually write the xref stream
- XRefStreamWriter writer(&index, stmBuf, offsetSize);
+ XRefStreamWriter writer(index, stmBuf, offsetSize);
writeXRef(&writer, gFalse);
- Object obj1, obj2;
- xrefDict->set("Type", obj1.initName("XRef"));
- xrefDict->set("Index", &index);
- obj2.initArray(xref);
- obj2.arrayAdd( obj1.initInt(1) );
- obj2.arrayAdd( obj1.initInt(offsetSize) );
- obj2.arrayAdd( obj1.initInt(2) );
- xrefDict->set("W", &obj2);
+ xrefDict->set("Type", Object(objName, "XRef"));
+ xrefDict->set("Index", Object(index));
+ Array *wArray = new Array(xref);
+ wArray->add( Object(1) );
+ wArray->add( Object(offsetSize) );
+ wArray->add( Object(2) );
+ xrefDict->set("W", Object(wArray));
}
GBool XRef::parseEntry(Goffset offset, XRefEntry *entry)
{
GBool r;
- Object obj;
- obj.initNull();
- Parser parser = Parser(NULL, new Lexer(NULL,
- str->makeSubStream(offset, gFalse, 20, &obj)), gTrue);
+ Parser parser(NULL, new Lexer(NULL,
+ str->makeSubStream(offset, gFalse, 20, Object(objNull))), gTrue);
Object obj1, obj2, obj3;
- if (((parser.getObj(&obj1)->isInt()) || obj1.isInt64()) &&
- (parser.getObj(&obj2)->isInt()) &&
- (parser.getObj(&obj3)->isCmd("n") || obj3.isCmd("f"))) {
+ if (((obj1 = parser.getObj(), obj1.isInt()) || obj1.isInt64()) &&
+ (obj2 = parser.getObj(), obj2.isInt()) &&
+ (obj3 = parser.getObj(), obj3.isCmd("n") || obj3.isCmd("f"))) {
if (obj1.isInt64())
entry->offset = obj1.getInt64();
else
entry->offset = obj1.getInt();
entry->gen = obj2.getInt();
entry->type = obj3.isCmd("n") ? xrefEntryUncompressed : xrefEntryFree;
- entry->obj.initNull ();
+ entry->obj.setToNull();
entry->flags = 0;
r = gTrue;
} else {
r = gFalse;
}
- obj1.free();
- obj2.free();
- obj3.free();
return r;
}
@@ -1719,8 +1637,8 @@
{
Array *array = obj->getArray();
for (int i = 0; i < array->getLength(); i++) {
- markUnencrypted(array->getNF(i, &obj1));
- obj1.free();
+ obj1 = array->getNF(i);
+ markUnencrypted(&obj1);
}
break;
}
@@ -1735,8 +1653,8 @@
dict = obj->getDict();
}
for (int i = 0; i < dict->getLength(); i++) {
- markUnencrypted(dict->getValNF(i, &obj1));
- obj1.free();
+ obj1 = dict->getValNF(i);
+ markUnencrypted(&obj1);
}
break;
}
@@ -1747,9 +1665,8 @@
if (e->getFlag(XRefEntry::Unencrypted))
return; // We've already been here: prevent infinite recursion
e->setFlag(XRefEntry::Unencrypted, gTrue);
- fetch(ref.num, ref.gen, &obj1);
+ obj1 = fetch(ref.num, ref.gen);
markUnencrypted(&obj1);
- obj1.free();
break;
}
default:
@@ -1793,19 +1710,16 @@
}
// Mark objects referred from the Encrypt dict as Unencrypted
- Object obj;
- markUnencrypted(trailerDict.dictLookupNF("Encrypt", &obj));
- obj.free();
+ Object obj = trailerDict.dictLookupNF("Encrypt");
+ markUnencrypted();
}
void XRef::markUnencrypted() {
// Mark objects referred from the Encrypt dict as Unencrypted
- Object obj;
- trailerDict.dictLookupNF("Encrypt", &obj);
+ Object obj = trailerDict.dictLookupNF("Encrypt");
if (obj.isRef()) {
XRefEntry *e = getEntry(obj.getRefNum());
e->setFlag(XRefEntry::Unencrypted, gTrue);
}
- obj.free();
}
diff --git a/poppler/XRef.h b/poppler/XRef.h
index 0439161..e59e8cb 100644
--- a/poppler/XRef.h
+++ b/poppler/XRef.h
@@ -14,7 +14,7 @@
// under GPL version 2 or later
//
// Copyright (C) 2005 Brad Hards <bradh@frogmouth.net>
-// Copyright (C) 2006, 2008, 2010-2013 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2006, 2008, 2010-2013, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2007-2008 Julien Rebetez <julienr@svn.gnome.org>
// Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
// Copyright (C) 2010 Ilya Gorenbein <igorenbein@finjan.com>
@@ -141,18 +141,18 @@
int getPermFlags() { return permFlags; }
// Get catalog object.
- Object *getCatalog(Object *obj);
+ Object getCatalog();
// Fetch an indirect reference.
- Object *fetch(int num, int gen, Object *obj, int recursion = 0);
+ Object fetch(int num, int gen, int recursion = 0);
// Return the document's Info dictionary (if any).
- Object *getDocInfo(Object *obj);
- Object *getDocInfoNF(Object *obj);
+ Object getDocInfo();
+ Object getDocInfoNF();
// Create and return the document's Info dictionary if none exists.
// Otherwise return the existing one.
- Object *createDocInfoIfNoneExists(Object *obj);
+ Object createDocInfoIfNoneExists();
// Remove the document's Info dictionary and update the trailer dictionary.
void removeDocInfo();
@@ -271,11 +271,11 @@
// XRefWriter subclass that writes a XRef stream
class XRefStreamWriter: public XRefWriter {
public:
- XRefStreamWriter(Object *index, GooString *stmBuf, int offsetSize);
+ XRefStreamWriter(Array *index, GooString *stmBuf, int offsetSize);
void startSection(int first, int count) override;
void writeEntry(Goffset offset, int gen, XRefEntryType type) override;
private:
- Object *index;
+ Array *index;
GooString *stmBuf;
int offsetSize;
};
diff --git a/qt4/src/poppler-annotation-helper.h b/qt4/src/poppler-annotation-helper.h
index 5f335c0..3150569 100644
--- a/qt4/src/poppler-annotation-helper.h
+++ b/qt4/src/poppler-annotation-helper.h
@@ -1,5 +1,5 @@
/* poppler-annotation-helper.h: qt interface to poppler
- * Copyright (C) 2006, 2008, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2006, 2008, 2017, Albert Astals Cid <aacid@kde.org>
* Copyright (C) 2008, Pino Toscano <pino@kde.org>
* Copyright (C) 2012, Fabio D'Urso <fabiodurso@hotmail.it>
* Adapting code from
@@ -50,83 +50,71 @@
void XPDFReader::lookupName( Dict * dict, char * type, QString & dest )
{
- Object nameObj;
- dict->lookup( type, &nameObj );
+ Object nameObj = dict->lookup( type );
if ( nameObj.isNull() )
return;
if ( nameObj.isName() )
dest = nameObj.getName();
else
qDebug() << type << " is not Name." << endl;
- nameObj.free();
}
void XPDFReader::lookupString( Dict * dict, char * type, QString & dest )
{
- Object stringObj;
- dict->lookup( type, &stringObj );
+ Object stringObj = dict->lookup( type );
if ( stringObj.isNull() )
return;
if ( stringObj.isString() )
dest = stringObj.getString()->getCString();
else
qDebug() << type << " is not String." << endl;
- stringObj.free();
}
void XPDFReader::lookupBool( Dict * dict, char * type, bool & dest )
{
- Object boolObj;
- dict->lookup( type, &boolObj );
+ Object boolObj = dict->lookup( type );
if ( boolObj.isNull() )
return;
if ( boolObj.isBool() )
dest = boolObj.getBool() == gTrue;
else
qDebug() << type << " is not Bool." << endl;
- boolObj.free();
}
void XPDFReader::lookupInt( Dict * dict, char * type, int & dest )
{
- Object intObj;
- dict->lookup( type, &intObj );
+ Object intObj = dict->lookup( type );
if ( intObj.isNull() )
return;
if ( intObj.isInt() )
dest = intObj.getInt();
else
qDebug() << type << " is not Int." << endl;
- intObj.free();
}
void XPDFReader::lookupNum( Dict * dict, char * type, double & dest )
{
- Object numObj;
- dict->lookup( type, &numObj );
+ Object numObj = dict->lookup( type );
if ( numObj.isNull() )
return;
if ( numObj.isNum() )
dest = numObj.getNum();
else
qDebug() << type << " is not Num." << endl;
- numObj.free();
}
int XPDFReader::lookupNumArray( Dict * dict, char * type, double * dest, int len )
{
- Object arrObj;
- dict->lookup( type, &arrObj );
+ Object arrObj = dict->lookup( type );
if ( arrObj.isNull() )
return 0;
- Object numObj;
if ( arrObj.isArray() )
{
len = qMin( len, arrObj.arrayGetLength() );
for ( int i = 0; i < len; i++ )
{
- dest[i] = arrObj.arrayGet( i, &numObj )->getNum();
- numObj.free();
+ Object numObj = arrObj.arrayGet( i );
+ dest[i] = numObj.getNum();
}
}
else
@@ -134,7 +122,6 @@
len = 0;
qDebug() << type << "is not Array." << endl;
}
- arrObj.free();
return len;
}
@@ -147,21 +134,18 @@
void XPDFReader::lookupIntRef( Dict * dict, char * type, int & dest )
{
- Object refObj;
- dict->lookupNF( type, &refObj );
+ Object refObj = dict->lookupNF( type );
if ( refObj.isNull() )
return;
if ( refObj.isRef() )
dest = refObj.getRefNum();
else
qDebug() << type << " is not Ref." << endl;
- refObj.free();
}
void XPDFReader::lookupDate( Dict * dict, char * type, QDateTime & dest )
{
- Object dateObj;
- dict->lookup( type, &dateObj );
+ Object dateObj = dict->lookup( type );
if ( dateObj.isNull() )
return;
if ( dateObj.isString() )
@@ -170,7 +154,6 @@
}
else
qDebug() << type << " is not Date" << endl;
- dateObj.free();
}
void XPDFReader::transform( double * M, double x, double y, QPointF &res )
diff --git a/qt4/src/poppler-document.cc b/qt4/src/poppler-document.cc
index 7f8abfa..f5ac11e 100644
--- a/qt4/src/poppler-document.cc
+++ b/qt4/src/poppler-document.cc
@@ -1,7 +1,7 @@
/* poppler-document.cc: qt interface to poppler
* Copyright (C) 2005, Net Integration Technologies, Inc.
* Copyright (C) 2005, 2008, Brad Hards <bradh@frogmouth.net>
- * Copyright (C) 2005-2010, 2012, 2013, 2015, 2016, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2005-2010, 2012, 2013, 2015-2017, Albert Astals Cid <aacid@kde.org>
* Copyright (C) 2006-2010, Pino Toscano <pino@kde.org>
* Copyright (C) 2010, 2011 Hib Eris <hib@hiberis.nl>
* Copyright (C) 2012 Koji Otani <sho@bbr.jp>
@@ -257,12 +257,10 @@
QByteArray result;
if (fi.isEmbedded())
{
- Object refObj, strObj;
XRef *xref = m_doc->doc->getXRef()->copy();
- refObj.initRef(fi.m_data->embRef.num, fi.m_data->embRef.gen);
- refObj.fetch(xref, &strObj);
- refObj.free();
+ Object refObj(fi.m_data->embRef.num, fi.m_data->embRef.gen);
+ Object strObj = refObj.fetch(xref);
if (strObj.isStream())
{
int c;
@@ -273,7 +271,6 @@
}
strObj.streamClose();
}
- strObj.free();
delete xref;
}
return result;
@@ -434,14 +431,13 @@
{
QStringList keys;
- Object info;
if ( m_doc->locked )
return QStringList();
QScopedPointer<XRef> xref(m_doc->doc->getXRef()->copy());
if (!xref)
return QStringList();
- xref->getDocInfo(&info);
+ Object info = xref->getDocInfo();
if ( !info.isDict() )
return QStringList();
@@ -452,7 +448,6 @@
keys.append( QString::fromAscii(infoDict->getKey(i)) );
}
- info.free();
return keys;
}
diff --git a/qt4/src/poppler-form.cc b/qt4/src/poppler-form.cc
index 12aa329..57cde57 100644
--- a/qt4/src/poppler-form.cc
+++ b/qt4/src/poppler-form.cc
@@ -1,6 +1,6 @@
/* poppler-form.h: qt4 interface to poppler
* Copyright (C) 2007-2008, 2011, Pino Toscano <pino@kde.org>
- * Copyright (C) 2008, 2011, 2012, 2015, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2008, 2011, 2012, 2015, 2017, Albert Astals Cid <aacid@kde.org>
* Copyright (C) 2011 Carlos Garcia Campos <carlosgc@gnome.org>
* Copyright (C) 2012, Adam Reichold <adamreichold@myopera.com>
*
@@ -191,8 +191,8 @@
if (fwb->getButtonType() == formButtonPush)
{
Dict *dict = m_formData->fm->getObj()->getDict();
- Object obj1;
- if (dict->lookup("MK", &obj1)->isDict())
+ Object obj1 = dict->lookup("MK");
+ if (obj1.isDict())
{
AnnotAppearanceCharacs appearCharacs(obj1.getDict());
if (appearCharacs.getNormalCaption())
@@ -200,7 +200,6 @@
ret = UnicodeParsedString(appearCharacs.getNormalCaption());
}
}
- obj1.free();
}
else
{
diff --git a/qt4/src/poppler-optcontent.cc b/qt4/src/poppler-optcontent.cc
index a5b651a..0e7b534 100644
--- a/qt4/src/poppler-optcontent.cc
+++ b/qt4/src/poppler-optcontent.cc
@@ -3,7 +3,7 @@
* Copyright (C) 2007, Brad Hards <bradh@kde.org>
* Copyright (C) 2008, 2014, Pino Toscano <pino@kde.org>
* Copyright (C) 2008, Carlos Garcia Campos <carlosgc@gnome.org>
- * Copyright (C) 2015, 2016, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2015-2017, Albert Astals Cid <aacid@kde.org>
* Copyright (C) 2017, Hubert Figuière <hub@figuiere.net>
*
* This program is free software; you can redistribute it and/or modify
@@ -41,8 +41,7 @@
{
itemsInGroup.reserve( rbarray->getLength() );
for (int i = 0; i < rbarray->getLength(); ++i) {
- Object ref;
- rbarray->getNF( i, &ref );
+ Object ref = rbarray->getNF( i );
if ( ! ref.isRef() ) {
qDebug() << "expected ref, but got:" << ref.getType();
}
@@ -199,11 +198,9 @@
{
OptContentItem *lastItem = parentNode;
for (int i = 0; i < orderArray->getLength(); ++i) {
- Object orderItem;
- orderArray->get(i, &orderItem);
+ Object orderItem = orderArray->get(i);
if ( orderItem.isDict() ) {
- Object item;
- orderArray->getNF(i, &item);
+ Object item = orderArray->getNF(i);
if (item.isRef() ) {
OptContentItem *ocItem = m_optContentItems.value(QString::number(item.getRefNum()), 0);
if (ocItem) {
@@ -213,7 +210,6 @@
qDebug() << "could not find group for object" << item.getRefNum();
}
}
- item.free();
} else if ( (orderItem.isArray()) && (orderItem.arrayGetLength() > 0) ) {
parseOrderArray(lastItem, orderItem.getArray());
} else if ( orderItem.isString() ) {
@@ -226,7 +222,6 @@
} else {
qDebug() << "something unexpected";
}
- orderItem.free();
}
}
@@ -237,8 +232,7 @@
}
// This is an array of array(s)
for (int i = 0; i < rBGroupArray->getLength(); ++i) {
- Object rbObj;
- rBGroupArray->get(i, &rbObj);
+ Object rbObj = rBGroupArray->get(i);
if ( ! rbObj.isArray() ) {
qDebug() << "expected inner array, got:" << rbObj.getType();
return;
@@ -246,7 +240,6 @@
Array *rbarray = rbObj.getArray();
RadioButtonGroup *rbg = new RadioButtonGroup( this, rbarray );
m_rbgroups.append( rbg );
- rbObj.free();
}
}
diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc
index fb6a036..1a55bb5 100644
--- a/qt4/src/poppler-page.cc
+++ b/qt4/src/poppler-page.cc
@@ -1,7 +1,7 @@
/* poppler-page.cc: qt interface to poppler
* Copyright (C) 2005, Net Integration Technologies, Inc.
* Copyright (C) 2005, Brad Hards <bradh@frogmouth.net>
- * Copyright (C) 2005-2016, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2005-2017, Albert Astals Cid <aacid@kde.org>
* Copyright (C) 2005, Stefan Kebekus <stefan.kebekus@math.uni-koeln.de>
* Copyright (C) 2006-2011, Pino Toscano <pino@kde.org>
* Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org>
@@ -650,11 +650,10 @@
PageTransition *Page::transition() const
{
if (!m_page->transition) {
- Object o;
PageTransitionParams params;
- params.dictObj = m_page->page->getTrans(&o);
- if (params.dictObj->isDict()) m_page->transition = new PageTransition(params);
- o.free();
+ Object o = m_page->page->getTrans();
+ params.dictObj = &o;
+ if (o.isDict()) m_page->transition = new PageTransition(params);
}
return m_page->transition;
}
@@ -663,20 +662,15 @@
{
if ( act == Page::Opening || act == Page::Closing )
{
- Object o;
- m_page->page->getActions(&o);
+ Object o = m_page->page->getActions();
if (!o.isDict())
{
- o.free();
return 0;
}
Dict *dict = o.getDict();
- Object o2;
const char *key = act == Page::Opening ? "O" : "C";
- dict->lookup((char*)key, &o2);
+ Object o2 = dict->lookup((char*)key);
::LinkAction *lact = ::LinkAction::parseAction(&o2, m_page->parentDoc->doc->getCatalog()->getBaseURI() );
- o2.free();
- o.free();
Link *popplerLink = NULL;
if (lact != NULL)
{
diff --git a/qt4/src/poppler-private.h b/qt4/src/poppler-private.h
index 0c0731c..a5ad3f3 100644
--- a/qt4/src/poppler-private.h
+++ b/qt4/src/poppler-private.h
@@ -1,7 +1,7 @@
/* poppler-private.h: qt interface to poppler
* Copyright (C) 2005, Net Integration Technologies, Inc.
* Copyright (C) 2005, 2008, Brad Hards <bradh@frogmouth.net>
- * Copyright (C) 2006-2009, 2011, 2012 by Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2006-2009, 2011, 2012, 2017 by Albert Astals Cid <aacid@kde.org>
* Copyright (C) 2007-2009, 2011 by Pino Toscano <pino@kde.org>
* Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
* Copyright (C) 2011 Hib Eris <hib@hiberis.nl>
@@ -103,10 +103,8 @@
DocumentData(const QByteArray &data, GooString *ownerPassword, GooString *userPassword)
{
- Object obj;
fileContents = data;
- obj.initNull();
- MemStream *str = new MemStream((char*)fileContents.data(), 0, fileContents.length(), &obj);
+ MemStream *str = new MemStream((char*)fileContents.data(), 0, fileContents.length(), Object(objNull));
init();
doc = new PDFDoc(str, ownerPassword, userPassword);
delete ownerPassword;
diff --git a/qt4/tests/check_lexer.cpp b/qt4/tests/check_lexer.cpp
index 243a592..93c3621 100644
--- a/qt4/tests/check_lexer.cpp
+++ b/qt4/tests/check_lexer.cpp
@@ -13,112 +13,91 @@
void TestLexer::testNumbers()
{
char data[] = "0 1 -1 2147483647 -2147483647 2147483648 -2147483648 4294967297 -2147483649 0.1 1.1 -1.1 2147483647.1 -2147483647.1 2147483648.1 -2147483648.1 4294967297.1 -2147483649.1 9223372036854775807 18446744073709551615";
- Object dummy;
- MemStream *stream = new MemStream(data, 0, strlen(data), &dummy);
+ MemStream *stream = new MemStream(data, 0, strlen(data), Object(objNull));
Lexer *lexer = new Lexer(NULL, stream);
QVERIFY( lexer );
Object obj;
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt);
QCOMPARE(obj.getInt(), 0);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt);
QCOMPARE(obj.getInt(), 1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt);
QCOMPARE(obj.getInt(), -1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt);
QCOMPARE(obj.getInt(), 2147483647);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt);
QCOMPARE(obj.getInt(), -2147483647);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt64);
QCOMPARE(obj.getInt64(), 2147483648ll);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt);
QCOMPARE(obj.getInt(), -2147483647-1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt64);
QCOMPARE(obj.getInt64(), 4294967297ll);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt64);
QCOMPARE(obj.getInt64(), -2147483649ll);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), 0.1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), 1.1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), -1.1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), 2147483647.1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), -2147483647.1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), 2147483648.1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), -2147483648.1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), 4294967297.1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), -2147483649.1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt64);
QCOMPARE(obj.getInt64(), 9223372036854775807ll);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), 18446744073709551616.);
- obj.free();
delete lexer;
}
diff --git a/qt4/tests/check_optcontent.cpp b/qt4/tests/check_optcontent.cpp
index 22b14a4..2de2995 100644
--- a/qt4/tests/check_optcontent.cpp
+++ b/qt4/tests/check_optcontent.cpp
@@ -101,66 +101,57 @@
// AnyOn, one element array:
// 22 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOn>>endobj
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0 );
QVERIFY( obj.isDict() );
QVERIFY( ocgs->optContentIsVisible( &obj ) );
- obj.free();
// Same again, looking for any leaks or dubious free()'s
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0 );
QVERIFY( obj.isDict() );
QVERIFY( ocgs->optContentIsVisible( &obj ) );
- obj.free();
// AnyOff, one element array:
// 29 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOff>>endobj
- xref->fetch( 29, 0, &obj );
+ obj = xref->fetch( 29, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOn, one element array:
// 36 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOn>>endobj
- xref->fetch( 36, 0, &obj );
+ obj = xref->fetch( 36, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOff, one element array:
// 43 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOff>>endobj
- xref->fetch( 43, 0, &obj );
+ obj = xref->fetch( 43, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AnyOn, multi-element array:
// 50 0 obj<</Type/OCMD/OCGs[21 0 R 28 0 R]/P/AnyOn>>endobj
- xref->fetch( 50, 0, &obj );
+ obj = xref->fetch( 50, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AnyOff, multi-element array:
// 57 0 obj<</Type/OCMD/P/AnyOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 57, 0, &obj );
+ obj = xref->fetch( 57, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOn, multi-element array:
// 64 0 obj<</Type/OCMD/P/AllOn/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 64, 0, &obj );
+ obj = xref->fetch( 64, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOff, multi-element array:
// 71 0 obj<</Type/OCMD/P/AllOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 71, 0, &obj );
+ obj = xref->fetch( 71, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
delete doc;
delete globalParams;
@@ -182,8 +173,7 @@
// In this test, both Ref(21,0) and Ref(28,0) start On,
// based on the file settings
- Object ref21obj;
- ref21obj.initRef( 21, 0 );
+ Object ref21obj( 21, 0 );
Ref ref21 = ref21obj.getRef();
OptionalContentGroup *ocgA = ocgs->findOcgByRef( ref21 );
QVERIFY( ocgA );
@@ -191,8 +181,7 @@
QVERIFY( (ocgA->getName()->cmp("A")) == 0 );
QCOMPARE( ocgA->getState(), OptionalContentGroup::On );
- Object ref28obj;
- ref28obj.initRef( 28, 0 );
+ Object ref28obj( 28, 0 );
Ref ref28 = ref28obj.getRef();
OptionalContentGroup *ocgB = ocgs->findOcgByRef( ref28 );
QVERIFY( ocgB );
@@ -205,65 +194,56 @@
// AnyOn, one element array:
// 22 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOn>>endobj
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// Same again, looking for any leaks or dubious free()'s
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AnyOff, one element array:
// 29 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOff>>endobj
- xref->fetch( 29, 0, &obj );
+ obj = xref->fetch( 29, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOn, one element array:
// 36 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOn>>endobj
- xref->fetch( 36, 0, &obj );
+ obj = xref->fetch( 36, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOff, one element array:
// 43 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOff>>endobj
- xref->fetch( 43, 0, &obj );
+ obj = xref->fetch( 43, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AnyOn, multi-element array:
// 50 0 obj<</Type/OCMD/OCGs[21 0 R 28 0 R]/P/AnyOn>>endobj
- xref->fetch( 50, 0, &obj );
+ obj = xref->fetch( 50, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AnyOff, multi-element array:
// 57 0 obj<</Type/OCMD/P/AnyOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 57, 0, &obj );
+ obj = xref->fetch( 57, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOn, multi-element array:
// 64 0 obj<</Type/OCMD/P/AllOn/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 64, 0, &obj );
+ obj = xref->fetch( 64, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOff, multi-element array:
// 71 0 obj<</Type/OCMD/P/AllOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 71, 0, &obj );
+ obj = xref->fetch( 71, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// Turn the other one off as well (i.e. both are Off)
@@ -271,65 +251,56 @@
// AnyOn, one element array:
// 22 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOn>>endobj
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// Same again, looking for any leaks or dubious free()'s
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AnyOff, one element array:
// 29 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOff>>endobj
- xref->fetch( 29, 0, &obj );
+ obj = xref->fetch( 29, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOn, one element array:
// 36 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOn>>endobj
- xref->fetch( 36, 0, &obj );
+ obj = xref->fetch( 36, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOff, one element array:
// 43 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOff>>endobj
- xref->fetch( 43, 0, &obj );
+ obj = xref->fetch( 43, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AnyOn, multi-element array:
// 50 0 obj<</Type/OCMD/OCGs[21 0 R 28 0 R]/P/AnyOn>>endobj
- xref->fetch( 50, 0, &obj );
+ obj = xref->fetch( 50, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AnyOff, multi-element array:
// 57 0 obj<</Type/OCMD/P/AnyOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 57, 0, &obj );
+ obj = xref->fetch( 57, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOn, multi-element array:
// 64 0 obj<</Type/OCMD/P/AllOn/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 64, 0, &obj );
+ obj = xref->fetch( 64, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOff, multi-element array:
// 71 0 obj<</Type/OCMD/P/AllOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 71, 0, &obj );
+ obj = xref->fetch( 71, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// Turn the first one on again (21 is On, 28 is Off)
@@ -337,65 +308,56 @@
// AnyOn, one element array:
// 22 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOn>>endobj
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// Same again, looking for any leaks or dubious free()'s
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AnyOff, one element array:
// 29 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOff>>endobj
- xref->fetch( 29, 0, &obj );
+ obj = xref->fetch( 29, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOn, one element array:
// 36 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOn>>endobj
- xref->fetch( 36, 0, &obj );
+ obj = xref->fetch( 36, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOff, one element array:
// 43 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOff>>endobj
- xref->fetch( 43, 0, &obj );
+ obj = xref->fetch( 43, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AnyOn, multi-element array:
// 50 0 obj<</Type/OCMD/OCGs[21 0 R 28 0 R]/P/AnyOn>>endobj
- xref->fetch( 50, 0, &obj );
+ obj = xref->fetch( 50, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AnyOff, multi-element array:
// 57 0 obj<</Type/OCMD/P/AnyOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 57, 0, &obj );
+ obj = xref->fetch( 57, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOn, multi-element array:
// 64 0 obj<</Type/OCMD/P/AllOn/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 64, 0, &obj );
+ obj = xref->fetch( 64, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOff, multi-element array:
// 71 0 obj<</Type/OCMD/P/AllOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 71, 0, &obj );
+ obj = xref->fetch( 71, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
delete doc;
delete globalParams;
diff --git a/qt5/src/poppler-annotation-helper.h b/qt5/src/poppler-annotation-helper.h
index 5f335c0..3150569 100644
--- a/qt5/src/poppler-annotation-helper.h
+++ b/qt5/src/poppler-annotation-helper.h
@@ -1,5 +1,5 @@
/* poppler-annotation-helper.h: qt interface to poppler
- * Copyright (C) 2006, 2008, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2006, 2008, 2017, Albert Astals Cid <aacid@kde.org>
* Copyright (C) 2008, Pino Toscano <pino@kde.org>
* Copyright (C) 2012, Fabio D'Urso <fabiodurso@hotmail.it>
* Adapting code from
@@ -50,83 +50,71 @@
void XPDFReader::lookupName( Dict * dict, char * type, QString & dest )
{
- Object nameObj;
- dict->lookup( type, &nameObj );
+ Object nameObj = dict->lookup( type );
if ( nameObj.isNull() )
return;
if ( nameObj.isName() )
dest = nameObj.getName();
else
qDebug() << type << " is not Name." << endl;
- nameObj.free();
}
void XPDFReader::lookupString( Dict * dict, char * type, QString & dest )
{
- Object stringObj;
- dict->lookup( type, &stringObj );
+ Object stringObj = dict->lookup( type );
if ( stringObj.isNull() )
return;
if ( stringObj.isString() )
dest = stringObj.getString()->getCString();
else
qDebug() << type << " is not String." << endl;
- stringObj.free();
}
void XPDFReader::lookupBool( Dict * dict, char * type, bool & dest )
{
- Object boolObj;
- dict->lookup( type, &boolObj );
+ Object boolObj = dict->lookup( type );
if ( boolObj.isNull() )
return;
if ( boolObj.isBool() )
dest = boolObj.getBool() == gTrue;
else
qDebug() << type << " is not Bool." << endl;
- boolObj.free();
}
void XPDFReader::lookupInt( Dict * dict, char * type, int & dest )
{
- Object intObj;
- dict->lookup( type, &intObj );
+ Object intObj = dict->lookup( type );
if ( intObj.isNull() )
return;
if ( intObj.isInt() )
dest = intObj.getInt();
else
qDebug() << type << " is not Int." << endl;
- intObj.free();
}
void XPDFReader::lookupNum( Dict * dict, char * type, double & dest )
{
- Object numObj;
- dict->lookup( type, &numObj );
+ Object numObj = dict->lookup( type );
if ( numObj.isNull() )
return;
if ( numObj.isNum() )
dest = numObj.getNum();
else
qDebug() << type << " is not Num." << endl;
- numObj.free();
}
int XPDFReader::lookupNumArray( Dict * dict, char * type, double * dest, int len )
{
- Object arrObj;
- dict->lookup( type, &arrObj );
+ Object arrObj = dict->lookup( type );
if ( arrObj.isNull() )
return 0;
- Object numObj;
if ( arrObj.isArray() )
{
len = qMin( len, arrObj.arrayGetLength() );
for ( int i = 0; i < len; i++ )
{
- dest[i] = arrObj.arrayGet( i, &numObj )->getNum();
- numObj.free();
+ Object numObj = arrObj.arrayGet( i );
+ dest[i] = numObj.getNum();
}
}
else
@@ -134,7 +122,6 @@
len = 0;
qDebug() << type << "is not Array." << endl;
}
- arrObj.free();
return len;
}
@@ -147,21 +134,18 @@
void XPDFReader::lookupIntRef( Dict * dict, char * type, int & dest )
{
- Object refObj;
- dict->lookupNF( type, &refObj );
+ Object refObj = dict->lookupNF( type );
if ( refObj.isNull() )
return;
if ( refObj.isRef() )
dest = refObj.getRefNum();
else
qDebug() << type << " is not Ref." << endl;
- refObj.free();
}
void XPDFReader::lookupDate( Dict * dict, char * type, QDateTime & dest )
{
- Object dateObj;
- dict->lookup( type, &dateObj );
+ Object dateObj = dict->lookup( type );
if ( dateObj.isNull() )
return;
if ( dateObj.isString() )
@@ -170,7 +154,6 @@
}
else
qDebug() << type << " is not Date" << endl;
- dateObj.free();
}
void XPDFReader::transform( double * M, double x, double y, QPointF &res )
diff --git a/qt5/src/poppler-document.cc b/qt5/src/poppler-document.cc
index 741a1b7..b326187 100644
--- a/qt5/src/poppler-document.cc
+++ b/qt5/src/poppler-document.cc
@@ -243,12 +243,10 @@
QByteArray result;
if (fi.isEmbedded())
{
- Object refObj, strObj;
XRef *xref = m_doc->doc->getXRef()->copy();
- refObj.initRef(fi.m_data->embRef.num, fi.m_data->embRef.gen);
- refObj.fetch(xref, &strObj);
- refObj.free();
+ Object refObj(fi.m_data->embRef.num, fi.m_data->embRef.gen);
+ Object strObj = refObj.fetch(xref);
if (strObj.isStream())
{
int c;
@@ -259,7 +257,6 @@
}
strObj.streamClose();
}
- strObj.free();
delete xref;
}
return result;
@@ -420,14 +417,13 @@
{
QStringList keys;
- Object info;
if ( m_doc->locked )
return QStringList();
QScopedPointer<XRef> xref(m_doc->doc->getXRef()->copy());
if (!xref)
return QStringList();
- xref->getDocInfo(&info);
+ Object info = xref->getDocInfo();
if ( !info.isDict() )
return QStringList();
@@ -438,7 +434,6 @@
keys.append( QString::fromLatin1(infoDict->getKey(i)) );
}
- info.free();
return keys;
}
diff --git a/qt5/src/poppler-form.cc b/qt5/src/poppler-form.cc
index 1ccb26c..6cbceb0 100644
--- a/qt5/src/poppler-form.cc
+++ b/qt5/src/poppler-form.cc
@@ -220,8 +220,8 @@
if (fwb->getButtonType() == formButtonPush)
{
Dict *dict = m_formData->fm->getObj()->getDict();
- Object obj1;
- if (dict->lookup("MK", &obj1)->isDict())
+ Object obj1 = dict->lookup("MK");
+ if (obj1.isDict())
{
AnnotAppearanceCharacs appearCharacs(obj1.getDict());
if (appearCharacs.getNormalCaption())
@@ -229,7 +229,6 @@
ret = UnicodeParsedString(appearCharacs.getNormalCaption());
}
}
- obj1.free();
}
else
{
diff --git a/qt5/src/poppler-optcontent.cc b/qt5/src/poppler-optcontent.cc
index 15ba650..805d896 100644
--- a/qt5/src/poppler-optcontent.cc
+++ b/qt5/src/poppler-optcontent.cc
@@ -3,7 +3,7 @@
* Copyright (C) 2007, Brad Hards <bradh@kde.org>
* Copyright (C) 2008, 2014, Pino Toscano <pino@kde.org>
* Copyright (C) 2008, Carlos Garcia Campos <carlosgc@gnome.org>
- * Copyright (C) 2015, 2016, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2015-2017, Albert Astals Cid <aacid@kde.org>
* Copyright (C) 2017, Hubert Figuière <hub@figuiere.net>
*
* This program is free software; you can redistribute it and/or modify
@@ -41,8 +41,7 @@
{
itemsInGroup.reserve(rbarray->getLength());
for (int i = 0; i < rbarray->getLength(); ++i) {
- Object ref;
- rbarray->getNF( i, &ref );
+ Object ref = rbarray->getNF( i );
if ( ! ref.isRef() ) {
qDebug() << "expected ref, but got:" << ref.getType();
}
@@ -199,11 +198,9 @@
{
OptContentItem *lastItem = parentNode;
for (int i = 0; i < orderArray->getLength(); ++i) {
- Object orderItem;
- orderArray->get(i, &orderItem);
+ Object orderItem = orderArray->get(i);
if ( orderItem.isDict() ) {
- Object item;
- orderArray->getNF(i, &item);
+ Object item = orderArray->getNF(i);
if (item.isRef() ) {
OptContentItem *ocItem = m_optContentItems.value(QString::number(item.getRefNum()), 0);
if (ocItem) {
@@ -213,7 +210,6 @@
qDebug() << "could not find group for object" << item.getRefNum();
}
}
- item.free();
} else if ( (orderItem.isArray()) && (orderItem.arrayGetLength() > 0) ) {
parseOrderArray(lastItem, orderItem.getArray());
} else if ( orderItem.isString() ) {
@@ -226,7 +222,6 @@
} else {
qDebug() << "something unexpected";
}
- orderItem.free();
}
}
@@ -237,8 +232,7 @@
}
// This is an array of array(s)
for (int i = 0; i < rBGroupArray->getLength(); ++i) {
- Object rbObj;
- rBGroupArray->get(i, &rbObj);
+ Object rbObj = rBGroupArray->get(i);
if ( ! rbObj.isArray() ) {
qDebug() << "expected inner array, got:" << rbObj.getType();
return;
@@ -246,7 +240,6 @@
Array *rbarray = rbObj.getArray();
RadioButtonGroup *rbg = new RadioButtonGroup( this, rbarray );
m_rbgroups.append( rbg );
- rbObj.free();
}
}
diff --git a/qt5/src/poppler-page.cc b/qt5/src/poppler-page.cc
index 4e35a36..0bba618 100644
--- a/qt5/src/poppler-page.cc
+++ b/qt5/src/poppler-page.cc
@@ -1,7 +1,7 @@
/* poppler-page.cc: qt interface to poppler
* Copyright (C) 2005, Net Integration Technologies, Inc.
* Copyright (C) 2005, Brad Hards <bradh@frogmouth.net>
- * Copyright (C) 2005-2016, Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2005-2017, Albert Astals Cid <aacid@kde.org>
* Copyright (C) 2005, Stefan Kebekus <stefan.kebekus@math.uni-koeln.de>
* Copyright (C) 2006-2011, Pino Toscano <pino@kde.org>
* Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org>
@@ -633,11 +633,10 @@
PageTransition *Page::transition() const
{
if (!m_page->transition) {
- Object o;
+ Object o = m_page->page->getTrans();
PageTransitionParams params;
- params.dictObj = m_page->page->getTrans(&o);
+ params.dictObj = &o;
if (params.dictObj->isDict()) m_page->transition = new PageTransition(params);
- o.free();
}
return m_page->transition;
}
@@ -646,20 +645,15 @@
{
if ( act == Page::Opening || act == Page::Closing )
{
- Object o;
- m_page->page->getActions(&o);
+ Object o = m_page->page->getActions();
if (!o.isDict())
{
- o.free();
return 0;
}
Dict *dict = o.getDict();
- Object o2;
const char *key = act == Page::Opening ? "O" : "C";
- dict->lookup((char*)key, &o2);
+ Object o2 = dict->lookup((char*)key);
::LinkAction *lact = ::LinkAction::parseAction(&o2, m_page->parentDoc->doc->getCatalog()->getBaseURI() );
- o2.free();
- o.free();
Link *popplerLink = NULL;
if (lact != NULL)
{
diff --git a/qt5/src/poppler-private.h b/qt5/src/poppler-private.h
index 9afcc84..6d0d194 100644
--- a/qt5/src/poppler-private.h
+++ b/qt5/src/poppler-private.h
@@ -1,7 +1,7 @@
/* poppler-private.h: qt interface to poppler
* Copyright (C) 2005, Net Integration Technologies, Inc.
* Copyright (C) 2005, 2008, Brad Hards <bradh@frogmouth.net>
- * Copyright (C) 2006-2009, 2011, 2012 by Albert Astals Cid <aacid@kde.org>
+ * Copyright (C) 2006-2009, 2011, 2012, 2017 by Albert Astals Cid <aacid@kde.org>
* Copyright (C) 2007-2009, 2011, 2014 by Pino Toscano <pino@kde.org>
* Copyright (C) 2011 Andreas Hartmetz <ahartmetz@gmail.com>
* Copyright (C) 2011 Hib Eris <hib@hiberis.nl>
@@ -103,10 +103,8 @@
DocumentData(const QByteArray &data, GooString *ownerPassword, GooString *userPassword)
{
- Object obj;
fileContents = data;
- obj.initNull();
- MemStream *str = new MemStream((char*)fileContents.data(), 0, fileContents.length(), &obj);
+ MemStream *str = new MemStream((char*)fileContents.data(), 0, fileContents.length(), Object(objNull));
init();
doc = new PDFDoc(str, ownerPassword, userPassword);
delete ownerPassword;
diff --git a/qt5/tests/check_lexer.cpp b/qt5/tests/check_lexer.cpp
index 243a592..4453e90 100644
--- a/qt5/tests/check_lexer.cpp
+++ b/qt5/tests/check_lexer.cpp
@@ -13,112 +13,91 @@
void TestLexer::testNumbers()
{
char data[] = "0 1 -1 2147483647 -2147483647 2147483648 -2147483648 4294967297 -2147483649 0.1 1.1 -1.1 2147483647.1 -2147483647.1 2147483648.1 -2147483648.1 4294967297.1 -2147483649.1 9223372036854775807 18446744073709551615";
- Object dummy;
- MemStream *stream = new MemStream(data, 0, strlen(data), &dummy);
+ MemStream *stream = new MemStream(data, 0, strlen(data), Object(objNull));
Lexer *lexer = new Lexer(NULL, stream);
QVERIFY( lexer );
Object obj;
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt);
QCOMPARE(obj.getInt(), 0);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt);
QCOMPARE(obj.getInt(), 1);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt);
QCOMPARE(obj.getInt(), -1);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt);
QCOMPARE(obj.getInt(), 2147483647);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt);
QCOMPARE(obj.getInt(), -2147483647);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt64);
QCOMPARE(obj.getInt64(), 2147483648ll);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt);
QCOMPARE(obj.getInt(), -2147483647-1);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt64);
QCOMPARE(obj.getInt64(), 4294967297ll);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt64);
QCOMPARE(obj.getInt64(), -2147483649ll);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), 0.1);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), 1.1);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), -1.1);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), 2147483647.1);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), -2147483647.1);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), 2147483648.1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), -2147483648.1);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), 4294967297.1);
- obj.free();
-
- lexer->getObj(&obj);
+
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), -2147483649.1);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objInt64);
QCOMPARE(obj.getInt64(), 9223372036854775807ll);
- obj.free();
- lexer->getObj(&obj);
+ obj = lexer->getObj();
QCOMPARE(obj.getType(), objReal);
QCOMPARE(obj.getReal(), 18446744073709551616.);
- obj.free();
delete lexer;
}
diff --git a/qt5/tests/check_optcontent.cpp b/qt5/tests/check_optcontent.cpp
index cac1b43..32af227 100644
--- a/qt5/tests/check_optcontent.cpp
+++ b/qt5/tests/check_optcontent.cpp
@@ -101,66 +101,57 @@
// AnyOn, one element array:
// 22 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOn>>endobj
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0 );
QVERIFY( obj.isDict() );
QVERIFY( ocgs->optContentIsVisible( &obj ) );
- obj.free();
// Same again, looking for any leaks or dubious free()'s
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0 );
QVERIFY( obj.isDict() );
QVERIFY( ocgs->optContentIsVisible( &obj ) );
- obj.free();
// AnyOff, one element array:
// 29 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOff>>endobj
- xref->fetch( 29, 0, &obj );
+ obj = xref->fetch( 29, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOn, one element array:
// 36 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOn>>endobj
- xref->fetch( 36, 0, &obj );
+ obj = xref->fetch( 36, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOff, one element array:
// 43 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOff>>endobj
- xref->fetch( 43, 0, &obj );
+ obj = xref->fetch( 43, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AnyOn, multi-element array:
// 50 0 obj<</Type/OCMD/OCGs[21 0 R 28 0 R]/P/AnyOn>>endobj
- xref->fetch( 50, 0, &obj );
+ obj = xref->fetch( 50, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AnyOff, multi-element array:
// 57 0 obj<</Type/OCMD/P/AnyOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 57, 0, &obj );
+ obj = xref->fetch( 57, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOn, multi-element array:
// 64 0 obj<</Type/OCMD/P/AllOn/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 64, 0, &obj );
+ obj = xref->fetch( 64, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOff, multi-element array:
// 71 0 obj<</Type/OCMD/P/AllOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 71, 0, &obj );
+ obj = xref->fetch( 71, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
delete doc;
delete globalParams;
@@ -182,8 +173,7 @@
// In this test, both Ref(21,0) and Ref(28,0) start On,
// based on the file settings
- Object ref21obj;
- ref21obj.initRef( 21, 0 );
+ Object ref21obj( 21, 0 );
Ref ref21 = ref21obj.getRef();
OptionalContentGroup *ocgA = ocgs->findOcgByRef( ref21 );
QVERIFY( ocgA );
@@ -191,8 +181,7 @@
QVERIFY( (ocgA->getName()->cmp("A")) == 0 );
QCOMPARE( ocgA->getState(), OptionalContentGroup::On );
- Object ref28obj;
- ref28obj.initRef( 28, 0 );
+ Object ref28obj( 28, 0 );
Ref ref28 = ref28obj.getRef();
OptionalContentGroup *ocgB = ocgs->findOcgByRef( ref28 );
QVERIFY( ocgB );
@@ -205,65 +194,56 @@
// AnyOn, one element array:
// 22 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOn>>endobj
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// Same again, looking for any leaks or dubious free()'s
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AnyOff, one element array:
// 29 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOff>>endobj
- xref->fetch( 29, 0, &obj );
+ obj = xref->fetch( 29, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOn, one element array:
// 36 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOn>>endobj
- xref->fetch( 36, 0, &obj );
+ obj = xref->fetch( 36, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOff, one element array:
// 43 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOff>>endobj
- xref->fetch( 43, 0, &obj );
+ obj = xref->fetch( 43, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AnyOn, multi-element array:
// 50 0 obj<</Type/OCMD/OCGs[21 0 R 28 0 R]/P/AnyOn>>endobj
- xref->fetch( 50, 0, &obj );
+ obj = xref->fetch( 50, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AnyOff, multi-element array:
// 57 0 obj<</Type/OCMD/P/AnyOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 57, 0, &obj );
+ obj = xref->fetch( 57, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOn, multi-element array:
// 64 0 obj<</Type/OCMD/P/AllOn/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 64, 0, &obj );
+ obj = xref->fetch( 64, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOff, multi-element array:
// 71 0 obj<</Type/OCMD/P/AllOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 71, 0, &obj );
+ obj = xref->fetch( 71, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// Turn the other one off as well (i.e. both are Off)
@@ -271,65 +251,56 @@
// AnyOn, one element array:
// 22 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOn>>endobj
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// Same again, looking for any leaks or dubious free()'s
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AnyOff, one element array:
// 29 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOff>>endobj
- xref->fetch( 29, 0, &obj );
+ obj = xref->fetch( 29, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOn, one element array:
// 36 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOn>>endobj
- xref->fetch( 36, 0, &obj );
+ obj = xref->fetch( 36, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOff, one element array:
// 43 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOff>>endobj
- xref->fetch( 43, 0, &obj );
+ obj = xref->fetch( 43, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AnyOn, multi-element array:
// 50 0 obj<</Type/OCMD/OCGs[21 0 R 28 0 R]/P/AnyOn>>endobj
- xref->fetch( 50, 0, &obj );
+ obj = xref->fetch( 50, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AnyOff, multi-element array:
// 57 0 obj<</Type/OCMD/P/AnyOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 57, 0, &obj );
+ obj = xref->fetch( 57, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOn, multi-element array:
// 64 0 obj<</Type/OCMD/P/AllOn/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 64, 0, &obj );
+ obj = xref->fetch( 64, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOff, multi-element array:
// 71 0 obj<</Type/OCMD/P/AllOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 71, 0, &obj );
+ obj = xref->fetch( 71, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// Turn the first one on again (21 is On, 28 is Off)
@@ -337,65 +308,56 @@
// AnyOn, one element array:
// 22 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOn>>endobj
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// Same again, looking for any leaks or dubious free()'s
- xref->fetch( 22, 0, &obj );
+ obj = xref->fetch( 22, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AnyOff, one element array:
// 29 0 obj<</Type/OCMD/OCGs[21 0 R]/P/AnyOff>>endobj
- xref->fetch( 29, 0, &obj );
+ obj = xref->fetch( 29, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOn, one element array:
// 36 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOn>>endobj
- xref->fetch( 36, 0, &obj );
+ obj = xref->fetch( 36, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOff, one element array:
// 43 0 obj<</Type/OCMD/OCGs[28 0 R]/P/AllOff>>endobj
- xref->fetch( 43, 0, &obj );
+ obj = xref->fetch( 43, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AnyOn, multi-element array:
// 50 0 obj<</Type/OCMD/OCGs[21 0 R 28 0 R]/P/AnyOn>>endobj
- xref->fetch( 50, 0, &obj );
+ obj = xref->fetch( 50, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AnyOff, multi-element array:
// 57 0 obj<</Type/OCMD/P/AnyOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 57, 0, &obj );
+ obj = xref->fetch( 57, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), true );
- obj.free();
// AllOn, multi-element array:
// 64 0 obj<</Type/OCMD/P/AllOn/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 64, 0, &obj );
+ obj = xref->fetch( 64, 0);
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
// AllOff, multi-element array:
// 71 0 obj<</Type/OCMD/P/AllOff/OCGs[21 0 R 28 0 R]>>endobj
- xref->fetch( 71, 0, &obj );
+ obj = xref->fetch( 71, 0 );
QVERIFY( obj.isDict() );
QCOMPARE( ocgs->optContentIsVisible( &obj ), false );
- obj.free();
delete doc;
delete globalParams;
diff --git a/test/pdf-fullrewrite.cc b/test/pdf-fullrewrite.cc
index 8108372..1f8fcc4 100644
--- a/test/pdf-fullrewrite.cc
+++ b/test/pdf-fullrewrite.cc
@@ -124,14 +124,11 @@
* contain the same number of entries, we don't need to check that every key
* in dictB is also contained in dictA */
for (int i = 0; i < length; ++i) {
- Object valA, valB;
const char *key = dictA->getKey(i);
- dictA->getValNF(i, &valA);
- dictB->lookupNF(key, &valB);
+ Object valA = dictA->getValNF(i);
+ Object valB = dictB->lookupNF(key);
if (!compareObjects(&valA, &valB))
return gFalse;
- valA.free();
- valB.free();
}
return gTrue;
@@ -200,14 +197,11 @@
return gFalse;
} else {
for (int i = 0; i < length; ++i) {
- Object elemA, elemB;
- arrayA->getNF(i, &elemA);
- arrayB->getNF(i, &elemB);
+ Object elemA = arrayA->getNF(i);
+ Object elemB = arrayB->getNF(i);
if (!compareObjects(&elemA, &elemB)) {
return gFalse;
}
- elemA.free();
- elemB.free();
}
return gTrue;
}
@@ -348,15 +342,12 @@
}
// Compare contents
- Object origObj, newObj;
- origXRef->fetch(i, origGenNum, &origObj);
- newXRef->fetch(i, newGenNum, &newObj);
+ Object origObj = origXRef->fetch(i, origGenNum);
+ Object newObj = newXRef->fetch(i, newGenNum);
if (!compareObjects(&origObj, &newObj)) {
fprintf(stderr, "XRef entry %u: contents differ\n", i);
result = gFalse;
}
- origObj.free();
- newObj.free();
}
return result;
diff --git a/utils/pdfinfo.cc b/utils/pdfinfo.cc
index 9cfdc0f..738a506 100644
--- a/utils/pdfinfo.cc
+++ b/utils/pdfinfo.cc
@@ -15,7 +15,7 @@
// under GPL version 2 or later
//
// Copyright (C) 2006 Dom Lachowicz <cinamod@hotmail.com>
-// Copyright (C) 2007-2010, 2012, 2016 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2007-2010, 2012, 2016, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
// Copyright (C) 2011 Vittal Aithal <vittal.aithal@cognidox.com>
// Copyright (C) 2012, 2013, 2016 Adrian Johnson <ajohnson@redneon.com>
@@ -120,13 +120,13 @@
static void printInfoString(Dict *infoDict, const char *key, const char *text,
UnicodeMap *uMap) {
- Object obj;
GooString *s1;
Unicode *u;
char buf[8];
int i, n, len;
- if (infoDict->lookup(key, &obj)->isString()) {
+ Object obj = infoDict->lookup(key);
+ if (obj.isString()) {
fputs(text, stdout);
s1 = obj.getString();
len = TextStringToUCS4(s1, &u);
@@ -137,11 +137,9 @@
gfree(u);
fputc('\n', stdout);
}
- obj.free();
}
static void printInfoDate(Dict *infoDict, const char *key, const char *text) {
- Object obj;
char *s;
int year, mon, day, hour, min, sec, tz_hour, tz_minute;
char tz;
@@ -149,7 +147,8 @@
time_t time;
char buf[256];
- if (infoDict->lookup(key, &obj)->isString()) {
+ Object obj = infoDict->lookup(key);
+ if (obj.isString()) {
fputs(text, stdout);
s = obj.getString()->getCString();
// TODO do something with the timezone info
@@ -181,17 +180,16 @@
}
fputc('\n', stdout);
}
- obj.free();
}
void printISODate(Dict *infoDict, const char *key, const char *text)
{
- Object obj;
char *s;
int year, mon, day, hour, min, sec, tz_hour, tz_minute;
char tz;
- if (infoDict->lookup(key, &obj)->isString()) {
+ Object obj = infoDict->lookup(key);
+ if (obj.isString()) {
fputs(text, stdout);
s = obj.getString()->getCString();
if ( parseDateString( s, &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute ) ) {
@@ -208,7 +206,6 @@
}
fputc('\n', stdout);
}
- obj.free();
}
static void printBox(const char *text, PDFRectangle *box) {
@@ -291,14 +288,13 @@
void printInfo(PDFDoc *doc, UnicodeMap *uMap, long long filesize, GBool multiPage) {
Page *page;
- Object info;
char buf[256];
double w, h, wISO, hISO;
int pg, i;
int r;
// print doc info
- doc->getDocInfo(&info);
+ Object info = doc->getDocInfo();
if (info.isDict()) {
printInfoString(info.getDict(), "Title", "Title: ", uMap);
printInfoString(info.getDict(), "Subject", "Subject: ", uMap);
@@ -319,7 +315,6 @@
printInfoDate(info.getDict(), "ModDate", "ModDate: ");
}
}
- info.free();
// print tagging info
printf("Tagged: %s\n",
diff --git a/utils/pdftohtml.cc b/utils/pdftohtml.cc
index 50d8990..8e59b8b 100644
--- a/utils/pdftohtml.cc
+++ b/utils/pdftohtml.cc
@@ -13,7 +13,7 @@
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
-// Copyright (C) 2007-2008, 2010, 2012, 2015, 2016 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2007-2008, 2010, 2012, 2015-2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
// Copyright (C) 2010 Mike Slegeir <tehpola@yahoo.com>
// Copyright (C) 2010, 2013 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
@@ -333,7 +333,7 @@
goto error;
}
- doc->getDocInfo(&info);
+ info = doc->getDocInfo();
if (info.isDict()) {
docTitle = getInfoString(info.getDict(), "Title");
author = getInfoString(info.getDict(), "Author");
@@ -343,7 +343,6 @@
if( !date )
date = getInfoDate(info.getDict(), "CreationDate");
}
- info.free();
if( !docTitle ) docTitle = new GooString(htmlFileName);
if (!singleHtml)
@@ -464,7 +463,8 @@
// Is rawString UCS2 (as opposed to pdfDocEncoding)
GBool isUnicode;
- if (infoDict->lookup(key, &obj)->isString()) {
+ obj = infoDict->lookup(key);
+ if (obj.isString()) {
rawString = obj.getString();
// Convert rawString to unicode
@@ -491,7 +491,6 @@
delete[] unicodeString;
}
- obj.free();
return encodedString;
}
@@ -504,7 +503,8 @@
GooString *result = NULL;
char buf[256];
- if (infoDict->lookup(key, &obj)->isString()) {
+ obj = infoDict->lookup(key);
+ if (obj.isString()) {
s = obj.getString()->getCString();
// TODO do something with the timezone info
if ( parseDateString( s, &year, &mon, &day, &hour, &min, &sec, &tz, &tz_hour, &tz_minute ) ) {
@@ -527,7 +527,6 @@
result = new GooString(s);
}
}
- obj.free();
return result;
}
diff --git a/utils/pdftotext.cc b/utils/pdftotext.cc
index d931a96..141de72 100644
--- a/utils/pdftotext.cc
+++ b/utils/pdftotext.cc
@@ -16,7 +16,7 @@
// under GPL version 2 or later
//
// Copyright (C) 2006 Dominic Lachowicz <cinamod@hotmail.com>
-// Copyright (C) 2007-2008, 2010, 2011 Albert Astals Cid <aacid@kde.org>
+// Copyright (C) 2007-2008, 2010, 2011, 2017 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2009 Jan Jockusch <jan@jockusch.de>
// Copyright (C) 2010, 2013 Hib Eris <hib@hiberis.nl>
// Copyright (C) 2010 Kenneth Berland <ken@hero.com>
@@ -323,15 +323,14 @@
fputs("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">", f);
fputs("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n", f);
fputs("<head>\n", f);
- doc->getDocInfo(&info);
+ info = doc->getDocInfo();
if (info.isDict()) {
- Object obj;
- if (info.getDict()->lookup("Title", &obj)->isString()) {
+ Object obj = info.getDict()->lookup("Title");
+ if (obj.isString()) {
printInfoString(f, info.getDict(), "Title", "<title>", "</title>\n", uMap);
} else {
fputs("<title></title>\n", f);
}
- obj.free();
printInfoString(f, info.getDict(), "Subject",
"<meta name=\"Subject\" content=\"", "\"/>\n", uMap);
printInfoString(f, info.getDict(), "Keywords",
@@ -347,7 +346,6 @@
printInfoDate(f, info.getDict(), "LastModifiedDate",
"<meta name=\"ModDate\" content=\"\"/>\n");
}
- info.free();
fputs("</head>\n", f);
fputs("<body>\n", f);
if (!bbox) {
@@ -438,14 +436,14 @@
static void printInfoString(FILE *f, Dict *infoDict, const char *key,
const char *text1, const char *text2, UnicodeMap *uMap) {
- Object obj;
GooString *s1;
GBool isUnicode;
Unicode u;
char buf[9];
int i, n;
- if (infoDict->lookup(key, &obj)->isString()) {
+ Object obj = infoDict->lookup(key);
+ if (obj.isString()) {
fputs(text1, f);
s1 = obj.getString();
if ((s1->getChar(0) & 0xff) == 0xfe &&
@@ -472,21 +470,17 @@
}
fputs(text2, f);
}
- obj.free();
}
static void printInfoDate(FILE *f, Dict *infoDict, const char *key, const char *fmt) {
- Object obj;
- char *s;
-
- if (infoDict->lookup(key, &obj)->isString()) {
- s = obj.getString()->getCString();
+ Object obj = infoDict->lookup(key);
+ if (obj.isString()) {
+ char *s = obj.getString()->getCString();
if (s[0] == 'D' && s[1] == ':') {
s += 2;
}
fprintf(f, fmt, s);
}
- obj.free();
}
void printLine(FILE *f, TextLine *line) {
diff --git a/utils/pdfunite.cc b/utils/pdfunite.cc
index c32e201..c223c80 100644
--- a/utils/pdfunite.cc
+++ b/utils/pdfunite.cc
@@ -39,149 +39,86 @@
};
void doMergeNameTree(PDFDoc *doc, XRef *srcXRef, XRef *countRef, int oldRefNum, int newRefNum, Dict *srcNameTree, Dict *mergeNameTree, int numOffset) {
- Object mergeNameArray;
- Object srcNameArray;
- mergeNameTree->lookup("Names", &mergeNameArray);
- srcNameTree->lookup("Names", &srcNameArray);
+ Object mergeNameArray = mergeNameTree->lookup("Names");
+ Object srcNameArray = srcNameTree->lookup("Names");
if (mergeNameArray.isArray() && srcNameArray.isArray()) {
- Object *newNameArray = new Object();
- newNameArray->initArray(srcXRef);
+ Array *newNameArray = new Array(srcXRef);
int j = 0;
for (int i = 0; i < srcNameArray.arrayGetLength() - 1; i += 2) {
- Object key;
- Object value;
- srcNameArray.arrayGetNF(i, &key);
- srcNameArray.arrayGetNF(i + 1, &value);
+ Object key = srcNameArray.arrayGetNF(i);
+ Object value = srcNameArray.arrayGetNF(i + 1);
if (key.isString() && value.isRef()) {
while (j < mergeNameArray.arrayGetLength() - 1) {
- Object mkey;
- Object mvalue;
- mergeNameArray.arrayGetNF(j, &mkey);
- mergeNameArray.arrayGetNF(j + 1, &mvalue);
+ Object mkey = mergeNameArray.arrayGetNF(j);
+ Object mvalue = mergeNameArray.arrayGetNF(j + 1);
if (mkey.isString() && mvalue.isRef()) {
if (mkey.getString()->cmp(key.getString()) < 0) {
- Object *newKey = new Object();
- newKey->initString(new GooString(mkey.getString()->getCString()));
- newNameArray->arrayAdd(newKey);
- Object *newValue = new Object();
- newValue->initRef(mvalue.getRef().num + numOffset, mvalue.getRef().gen);
- newNameArray->arrayAdd(newValue);
- delete newKey;
- delete newValue;
+ newNameArray->add(Object(new GooString(mkey.getString()->getCString())));
+ newNameArray->add(Object(mvalue.getRef().num + numOffset, mvalue.getRef().gen));
j += 2;
} else if (mkey.getString()->cmp(key.getString()) == 0) {
j += 2;
} else {
- mkey.free();
- mvalue.free();
break;
}
} else {
j += 2;
}
- mkey.free();
- mvalue.free();
}
- Object *newKey = new Object();
- newKey->initString(new GooString(key.getString()->getCString()));
- newNameArray->arrayAdd(newKey);
- Object *newValue = new Object();
- newValue->initRef(value.getRef().num, value.getRef().gen);
- newNameArray->arrayAdd(newValue);
- delete newKey;
- delete newValue;
+ newNameArray->add(Object(new GooString(key.getString()->getCString())));
+ newNameArray->add(Object(value.getRef().num, value.getRef().gen));
}
- key.free();
- value.free();
}
while (j < mergeNameArray.arrayGetLength() - 1) {
- Object mkey;
- Object mvalue;
- mergeNameArray.arrayGetNF(j, &mkey);
- mergeNameArray.arrayGetNF(j + 1, &mvalue);
+ Object mkey = mergeNameArray.arrayGetNF(j);
+ Object mvalue = mergeNameArray.arrayGetNF(j + 1);
if (mkey.isString() && mvalue.isRef()) {
- Object *newKey = new Object();
- newKey->initString(new GooString(mkey.getString()->getCString()));
- newNameArray->arrayAdd(newKey);
- Object *newValue = new Object();
- newValue->initRef(mvalue.getRef().num + numOffset, mvalue.getRef().gen);
- newNameArray->arrayAdd(newValue);
- delete newKey;
- delete newValue;
+ newNameArray->add(Object(new GooString(mkey.getString()->getCString())));
+ newNameArray->add(Object(mvalue.getRef().num + numOffset, mvalue.getRef().gen));
}
j += 2;
- mkey.free();
- mvalue.free();
}
- srcNameTree->set("Names", newNameArray);
+ srcNameTree->set("Names", Object(newNameArray));
doc->markPageObjects(mergeNameTree, srcXRef, countRef, numOffset, oldRefNum, newRefNum);
- delete newNameArray;
} else if (srcNameArray.isNull() && mergeNameArray.isArray()) {
- Object *newNameArray = new Object();
- newNameArray->initArray(srcXRef);
+ Array *newNameArray = new Array(srcXRef);
for (int i = 0; i < mergeNameArray.arrayGetLength() - 1; i += 2) {
- Object key;
- Object value;
- mergeNameArray.arrayGetNF(i, &key);
- mergeNameArray.arrayGetNF(i + 1, &value);
+ Object key = mergeNameArray.arrayGetNF(i);
+ Object value = mergeNameArray.arrayGetNF(i + 1);
if (key.isString() && value.isRef()) {
- Object *newKey = new Object();
- newKey->initString(new GooString(key.getString()->getCString()));
- newNameArray->arrayAdd(newKey);
- Object *newValue = new Object();
- newValue->initRef(value.getRef().num + numOffset, value.getRef().gen);
- newNameArray->arrayAdd(newValue);
- delete newKey;
- delete newValue;
+ newNameArray->add(Object(new GooString(key.getString()->getCString())));
+ newNameArray->add(Object(value.getRef().num + numOffset, value.getRef().gen));
}
- key.free();
- value.free();
}
- srcNameTree->add(copyString("Names"), newNameArray);
+ srcNameTree->add(copyString("Names"), Object(newNameArray));
doc->markPageObjects(mergeNameTree, srcXRef, countRef, numOffset, oldRefNum, newRefNum);
}
- mergeNameArray.free();
- srcNameArray.free();
}
void doMergeNameDict(PDFDoc *doc, XRef *srcXRef, XRef *countRef, int oldRefNum, int newRefNum, Dict *srcNameDict, Dict *mergeNameDict, int numOffset) {
for (int i = 0; i < mergeNameDict->getLength(); i++) {
const char *key = mergeNameDict->getKey(i);
- Object mergeNameTree;
- Object srcNameTree;
- mergeNameDict->lookup(key, &mergeNameTree);
- srcNameDict->lookup(key, &srcNameTree);
+ Object mergeNameTree = mergeNameDict->lookup(key);
+ Object srcNameTree = srcNameDict->lookup(key);
if (srcNameTree.isDict() && mergeNameTree.isDict()) {
doMergeNameTree(doc, srcXRef, countRef, oldRefNum, newRefNum, srcNameTree.getDict(), mergeNameTree.getDict(), numOffset);
} else if (srcNameTree.isNull() && mergeNameTree.isDict()) {
- Object *newNameTree = new Object();
- newNameTree->initDict(srcXRef);
- doMergeNameTree(doc, srcXRef, countRef, oldRefNum, newRefNum, newNameTree->getDict(), mergeNameTree.getDict(), numOffset);
- srcNameDict->add(copyString(key), newNameTree);
+ Object newNameTree(new Dict(srcXRef));
+ doMergeNameTree(doc, srcXRef, countRef, oldRefNum, newRefNum, newNameTree.getDict(), mergeNameTree.getDict(), numOffset);
+ srcNameDict->add(copyString(key), std::move(newNameTree));
}
- srcNameTree.free();
- mergeNameTree.free();
}
}
void doMergeFormDict(Dict *srcFormDict, Dict *mergeFormDict, int numOffset) {
- Object srcFields, mergeFields;
-
- srcFormDict->lookup("Fields", &srcFields);
- mergeFormDict->lookup("Fields", &mergeFields);
+ Object srcFields = srcFormDict->lookup("Fields");
+ Object mergeFields = mergeFormDict->lookup("Fields");
if (srcFields.isArray() && mergeFields.isArray()) {
for (int i = 0; i < mergeFields.arrayGetLength(); i++) {
- Object value;
- Object *newValue = new Object();
- mergeFields.arrayGetNF(i, &value);
- newValue->initRef(value.getRef().num + numOffset, value.getRef().gen);
- srcFields.arrayAdd(newValue);
- value.free();
- delete newValue;
+ Object value = mergeFields.arrayGetNF(i);
+ srcFields.arrayAdd(Object(value.getRef().num + numOffset, value.getRef().gen));
}
}
- srcFields.free();
- mergeFields.free();
}
///////////////////////////////////////////////////////////////////////////
@@ -258,58 +195,50 @@
// handle OutputIntents, AcroForm, OCProperties & Names
Object intents;
+ Object names;
Object afObj;
Object ocObj;
- Object names;
if (docs.size() >= 1) {
- Object catObj;
- docs[0]->getXRef()->getCatalog(&catObj);
+ Object catObj = docs[0]->getXRef()->getCatalog();
Dict *catDict = catObj.getDict();
- catDict->lookup("OutputIntents", &intents);
- catDict->lookupNF("AcroForm", &afObj);
+ intents = catDict->lookup("OutputIntents");
+ afObj = catDict->lookupNF("AcroForm");
Ref *refPage = docs[0]->getCatalog()->getPageRef(1);
if (!afObj.isNull() && refPage) {
docs[0]->markAcroForm(&afObj, yRef, countRef, 0, refPage->num, refPage->num);
}
- catDict->lookupNF("OCProperties", &ocObj);
+ ocObj = catDict->lookupNF("OCProperties");
if (!ocObj.isNull() && ocObj.isDict() && refPage) {
docs[0]->markPageObjects(ocObj.getDict(), yRef, countRef, 0, refPage->num, refPage->num);
}
- catDict->lookup("Names", &names);
+ names = catDict->lookup("Names");
if (!names.isNull() && names.isDict() && refPage) {
docs[0]->markPageObjects(names.getDict(), yRef, countRef, 0, refPage->num, refPage->num);
}
if (intents.isArray() && intents.arrayGetLength() > 0) {
for (i = 1; i < (int) docs.size(); i++) {
- Object pagecatObj, pageintents;
- docs[i]->getXRef()->getCatalog(&pagecatObj);
+ Object pagecatObj = docs[i]->getXRef()->getCatalog();
Dict *pagecatDict = pagecatObj.getDict();
- pagecatDict->lookup("OutputIntents", &pageintents);
+ Object pageintents = pagecatDict->lookup("OutputIntents");
if (pageintents.isArray() && pageintents.arrayGetLength() > 0) {
for (j = intents.arrayGetLength() - 1; j >= 0; j--) {
- Object intent;
- intents.arrayGet(j, &intent, 0);
+ Object intent = intents.arrayGet(j, 0);
if (intent.isDict()) {
- Object idf;
- intent.dictLookup("OutputConditionIdentifier", &idf);
+ Object idf = intent.dictLookup("OutputConditionIdentifier");
if (idf.isString()) {
GooString *gidf = idf.getString();
GBool removeIntent = gTrue;
for (int k = 0; k < pageintents.arrayGetLength(); k++) {
- Object pgintent;
- pageintents.arrayGet(k, &pgintent, 0);
+ Object pgintent = pageintents.arrayGet(k, 0);
if (pgintent.isDict()) {
- Object pgidf;
- pgintent.dictLookup("OutputConditionIdentifier", &pgidf);
+ Object pgidf = pgintent.dictLookup("OutputConditionIdentifier");
if (pgidf.isString()) {
GooString *gpgidf = pgidf.getString();
if (gpgidf->cmp(gidf) == 0) {
- pgidf.free();
removeIntent = gFalse;
break;
}
}
- pgidf.free();
}
}
if (removeIntent) {
@@ -321,34 +250,26 @@
intents.arrayRemove(j);
error(errSyntaxWarning, -1, "Invalid output intent dict, missing required OutputConditionIdentifier");
}
- idf.free();
} else {
intents.arrayRemove(j);
}
- intent.free();
}
} else {
error(errSyntaxWarning, -1, "Output intents differs, remove them all");
- intents.free();
break;
}
- pagecatObj.free();
- pageintents.free();
}
}
if (intents.isArray() && intents.arrayGetLength() > 0) {
for (j = intents.arrayGetLength() - 1; j >= 0; j--) {
- Object intent;
- intents.arrayGet(j, &intent, 0);
+ Object intent = intents.arrayGet(j, 0);
if (intent.isDict()) {
docs[0]->markPageObjects(intent.getDict(), yRef, countRef, numOffset, 0, 0);
} else {
intents.arrayRemove(j);
}
- intent.free();
}
}
- catObj.free();
}
for (i = 0; i < (int) docs.size(); i++) {
@@ -364,48 +285,37 @@
docs[i]->getCatalog()->getPage(j)->getRotate(),
docs[i]->getCatalog()->getPage(j)->getMediaBox(), cropBox);
Ref *refPage = docs[i]->getCatalog()->getPageRef(j);
- Object page;
- docs[i]->getXRef()->fetch(refPage->num, refPage->gen, &page);
+ Object page = docs[i]->getXRef()->fetch(refPage->num, refPage->gen);
Dict *pageDict = page.getDict();
- Dict *resDict = docs[i]->getCatalog()->getPage(j)->getResourceDict();
- if (resDict) {
- Object *newResource = new Object();
- newResource->initDict(resDict);
- pageDict->set("Resources", newResource);
- delete newResource;
+ Object *resDict = docs[i]->getCatalog()->getPage(j)->getResourceDictObject();
+ if (resDict->isDict()) {
+ pageDict->set("Resources", resDict->copy());
}
- pages.push_back(page);
+ pages.push_back(std::move(page));
offsets.push_back(numOffset);
docs[i]->markPageObjects(pageDict, yRef, countRef, numOffset, refPage->num, refPage->num);
- Object annotsObj;
- pageDict->lookupNF("Annots", &annotsObj);
+ Object annotsObj = pageDict->lookupNF("Annots");
if (!annotsObj.isNull()) {
docs[i]->markAnnotations(&annotsObj, yRef, countRef, numOffset, refPage->num, refPage->num);
- annotsObj.free();
}
}
- Object pageCatObj, pageNames, pageForm;
- docs[i]->getXRef()->getCatalog(&pageCatObj);
+ Object pageCatObj = docs[i]->getXRef()->getCatalog();
Dict *pageCatDict = pageCatObj.getDict();
- pageCatDict->lookup("Names", &pageNames);
+ Object pageNames = pageCatDict->lookup("Names");
if (!pageNames.isNull() && pageNames.isDict()) {
if (!names.isDict()) {
- names.free();
- names.initDict(yRef);
+ names = Object(new Dict(yRef));
}
doMergeNameDict(docs[i], yRef, countRef, 0, 0, names.getDict(), pageNames.getDict(), numOffset);
}
- pageCatDict->lookup("AcroForm", &pageForm);
+ Object pageForm = pageCatDict->lookup("AcroForm");
if (i > 0 && !pageForm.isNull() && pageForm.isDict()) {
if (afObj.isNull()) {
- pageCatDict->lookupNF("AcroForm", &afObj);
+ afObj = pageCatDict->lookupNF("AcroForm");
} else if (afObj.isDict()) {
doMergeFormDict(afObj.getDict(), pageForm.getDict(), numOffset);
}
}
- pageForm.free();
- pageNames.free();
- pageCatObj.free();
objectsCount += docs[i]->writePageObjects(outStr, yRef, numOffset, gTrue);
numOffset = yRef->getNumObjects() + 1;
}
@@ -418,33 +328,27 @@
if (intents.isArray() && intents.arrayGetLength() > 0) {
outStr->printf(" /OutputIntents [");
for (j = 0; j < intents.arrayGetLength(); j++) {
- Object intent;
- intents.arrayGet(j, &intent, 0);
+ Object intent = intents.arrayGet(j, 0);
if (intent.isDict()) {
PDFDoc::writeObject(&intent, outStr, yRef, 0, NULL, cryptRC4, 0, 0, 0);
}
- intent.free();
}
outStr->printf("]");
}
- intents.free();
// insert AcroForm
if (!afObj.isNull()) {
outStr->printf(" /AcroForm ");
PDFDoc::writeObject(&afObj, outStr, yRef, 0, NULL, cryptRC4, 0, 0, 0);
- afObj.free();
}
// insert OCProperties
if (!ocObj.isNull() && ocObj.isDict()) {
outStr->printf(" /OCProperties ");
PDFDoc::writeObject(&ocObj, outStr, yRef, 0, NULL, cryptRC4, 0, 0, 0);
- ocObj.free();
}
// insert Names
if (!names.isNull() && names.isDict()) {
outStr->printf(" /Names ");
PDFDoc::writeObject(&names, outStr, yRef, 0, NULL, cryptRC4, 0, 0, 0);
- names.free();
}
outStr->printf(">>\nendobj\n");
objectsCount++;
@@ -466,15 +370,13 @@
if (j > 0)
outStr->printf(" ");
const char *key = pageDict->getKey(j);
- Object value;
- pageDict->getValNF(j, &value);
+ Object value = pageDict->getValNF(j);
if (strcmp(key, "Parent") == 0) {
outStr->printf("/Parent %d 0 R", rootNum + 1);
} else {
outStr->printf("/%s ", key);
PDFDoc::writeObject(&value, outStr, yRef, offsets[i], NULL, cryptRC4, 0, 0, 0);
}
- value.free();
}
outStr->printf(" >>\nendobj\n");
objectsCount++;
@@ -483,18 +385,16 @@
Ref ref;
ref.num = rootNum;
ref.gen = 0;
- Dict *trailerDict = PDFDoc::createTrailerDict(objectsCount, gFalse, 0, &ref, yRef,
+ Object trailerDict = PDFDoc::createTrailerDict(objectsCount, gFalse, 0, &ref, yRef,
fileName, outStr->getPos());
- PDFDoc::writeXRefTableTrailer(trailerDict, yRef, gTrue, // write all entries according to ISO 32000-1, 7.5.4 Cross-Reference Table: "For a file that has never been incrementally updated, the cross-reference section shall contain only one subsection, whose object numbering begins at 0."
+ PDFDoc::writeXRefTableTrailer(std::move(trailerDict), yRef, gTrue, // write all entries according to ISO 32000-1, 7.5.4 Cross-Reference Table: "For a file that has never been incrementally updated, the cross-reference section shall contain only one subsection, whose object numbering begins at 0."
uxrefOffset, outStr, yRef);
- delete trailerDict;
outStr->close();
delete outStr;
fclose(f);
delete yRef;
delete countRef;
- for (j = 0; j < (int) pages.size (); j++) pages[j].free();
for (i = 0; i < (int) docs.size (); i++) delete docs[i];
delete globalParams;
return exitCode;