[poppler] 5 commits - glib/poppler-action.cc poppler/Link.cc poppler/Link.h qt5/src

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Dec 17 22:33:29 UTC 2019


 glib/poppler-action.cc        |   12 ++++----
 poppler/Link.cc               |   58 +++++++++++-------------------------------
 poppler/Link.h                |   17 +++++-------
 qt5/src/poppler-optcontent.cc |   14 +++++-----
 4 files changed, 37 insertions(+), 64 deletions(-)

New commits:
commit 42d5e54134ca82c96cb29e672e71e924d75526cf
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Tue Dec 17 21:06:31 2019 +0100

    Make StateList assignable
    
    Because it is already copy-constructible, and having one without
    the other is weird.

diff --git a/poppler/Link.h b/poppler/Link.h
index be77ece9..4477dd3f 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -451,8 +451,6 @@ public:
   struct StateList {
     StateList() = default;
     ~StateList() = default;
-    StateList(const StateList &) = default;
-    StateList& operator=(const StateList &) = delete;
     State st;
     std::vector<Ref> list;
   };
commit 62ae50571b1b0dca5369be76a962380b4c6e276a
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Sat Dec 14 22:19:53 2019 +0100

    LinkOCGState: Make stateList a std::vector of objects

diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc
index d449bdcf..193536c2 100644
--- a/glib/poppler-action.cc
+++ b/glib/poppler-action.cc
@@ -579,7 +579,7 @@ build_ocg_state (PopplerDocument *document,
 		 PopplerAction   *action,
 		 const LinkOCGState    *ocg_state)
 {
-	const std::vector<LinkOCGState::StateList*>& st_list = ocg_state->getStateList();
+	const std::vector<LinkOCGState::StateList>& st_list = ocg_state->getStateList();
 	bool    preserve_rb = ocg_state->getPreserveRB();
 	GList   *layer_state = nullptr;
 
@@ -588,10 +588,10 @@ build_ocg_state (PopplerDocument *document,
 			return;
 	}
 
-	for (const LinkOCGState::StateList *list : st_list) {
+	for (const LinkOCGState::StateList& list : st_list) {
 		PopplerActionLayer *action_layer = g_slice_new0 (PopplerActionLayer);
 
-		switch (list->st) {
+		switch (list.st) {
 		case LinkOCGState::On:
 			action_layer->action = POPPLER_ACTION_LAYER_ON;
 			break;
@@ -603,7 +603,7 @@ build_ocg_state (PopplerDocument *document,
 			break;
 		}
 
-		for (const Ref& ref : list->list) {
+		for (const Ref& ref : list.list) {
 			PopplerLayer *layer = get_layer_for_ref (document, document->layers, ref, preserve_rb);
 
 			action_layer->layers = g_list_prepend (action_layer->layers, layer);
diff --git a/poppler/Link.cc b/poppler/Link.cc
index a821b2b4..a25037ae 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -843,40 +843,35 @@ LinkOCGState::LinkOCGState(const Object *obj)
 
   Object obj1 = obj->dictLookup("State");
   if (obj1.isArray()) {
-    StateList *stList = nullptr;
+    StateList stList;
 
     for (int i = 0; i < obj1.arrayGetLength(); ++i) {
       const Object &obj2 = obj1.arrayGetNF(i);
       if (obj2.isName()) {
-        if (stList)
+        if (!stList.list.empty())
 	  stateList.push_back(stList);
 
 	const char *name = obj2.getName();
-	stList = new StateList();
+	stList.list.clear();
 	if (!strcmp (name, "ON")) {
-	  stList->st = On;
+	  stList.st = On;
 	} else if (!strcmp (name, "OFF")) {
-	  stList->st = Off;
+	  stList.st = Off;
 	} else if (!strcmp (name, "Toggle")) {
-	  stList->st = Toggle;
+	  stList.st = Toggle;
 	} else {
 	  error(errSyntaxWarning, -1, "Invalid name '{0:s}' in OCG Action state array", name);
-	  delete stList;
-	  stList = nullptr;
+	  isValid = false;
 	}
       } else if (obj2.isRef()) {
-        if (stList) {
-	  stList->list.push_back(obj2.getRef());
-	} else {
-	  error(errSyntaxWarning, -1, "Invalid OCG Action State array, expected name instead of ref");
-	}
+	  stList.list.push_back(obj2.getRef());
       } else {
         error(errSyntaxWarning, -1, "Invalid item in OCG Action State array");
         isValid = false;
       }
     }
     // Add the last group
-    if (stList)
+    if (!stList.list.empty())
       stateList.push_back(stList);
   } else {
     error(errSyntaxWarning, -1, "Invalid OCGState action");
@@ -889,12 +884,6 @@ LinkOCGState::LinkOCGState(const Object *obj)
   }
 }
 
-LinkOCGState::~LinkOCGState() {
-  for (auto entry : stateList) {
-    delete entry;
-  }
-}
-
 //------------------------------------------------------------------------
 // LinkHide
 //------------------------------------------------------------------------
diff --git a/poppler/Link.h b/poppler/Link.h
index 59c224f0..be77ece9 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -441,7 +441,7 @@ class LinkOCGState: public LinkAction {
 public:
   LinkOCGState(const Object *obj);
 
-  ~LinkOCGState() override;
+  ~LinkOCGState() override = default;
 
   bool isOk() const override { return isValid; }
 
@@ -451,17 +451,17 @@ public:
   struct StateList {
     StateList() = default;
     ~StateList() = default;
-    StateList(const StateList &) = delete;
+    StateList(const StateList &) = default;
     StateList& operator=(const StateList &) = delete;
     State st;
     std::vector<Ref> list;
   };
 
-  const std::vector<StateList*>& getStateList() const { return stateList; }
+  const std::vector<StateList>& getStateList() const { return stateList; }
   bool getPreserveRB() const { return preserveRB; }
 
 private:
-  std::vector<StateList*> stateList;
+  std::vector<StateList> stateList;
   bool isValid;
   bool preserveRB;
 };
diff --git a/qt5/src/poppler-optcontent.cc b/qt5/src/poppler-optcontent.cc
index 5aac5c92..ad959db8 100644
--- a/qt5/src/poppler-optcontent.cc
+++ b/qt5/src/poppler-optcontent.cc
@@ -401,15 +401,15 @@ namespace Poppler
 
     QSet<OptContentItem *> changedItems;
 
-    const std::vector<::LinkOCGState::StateList*>& statesList = popplerLinkOCGState->getStateList();
-    for (const ::LinkOCGState::StateList *stateList : statesList) {
-        const std::vector<Ref>& refsList = stateList->list;
+    const std::vector<::LinkOCGState::StateList>& statesList = popplerLinkOCGState->getStateList();
+    for (const ::LinkOCGState::StateList& stateList : statesList) {
+        const std::vector<Ref>& refsList = stateList.list;
         for (const Ref& ref : refsList) {
             OptContentItem *item = d->itemFromRef(QString::number(ref.num));
 
-            if (stateList->st == ::LinkOCGState::On) {
+            if (stateList.st == ::LinkOCGState::On) {
               item->setState(OptContentItem::On, popplerLinkOCGState->getPreserveRB(), changedItems);
-            } else if (stateList->st == ::LinkOCGState::Off) {
+            } else if (stateList.st == ::LinkOCGState::Off) {
               item->setState(OptContentItem::Off, popplerLinkOCGState->getPreserveRB(), changedItems);
             } else {
               OptContentItem::ItemState newState = item->state() == OptContentItem::On ? OptContentItem::Off : OptContentItem::On;
commit bd8d88f0db6954aa5d4181c0a5b4d0e19a635359
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Sat Dec 14 21:48:07 2019 +0100

    LinkOCGState: Replace std::vector* by std::vector

diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc
index 2117693f..d449bdcf 100644
--- a/glib/poppler-action.cc
+++ b/glib/poppler-action.cc
@@ -603,7 +603,7 @@ build_ocg_state (PopplerDocument *document,
 			break;
 		}
 
-		for (const Ref& ref : (*list->list)) {
+		for (const Ref& ref : list->list) {
 			PopplerLayer *layer = get_layer_for_ref (document, document->layers, ref, preserve_rb);
 
 			action_layer->layers = g_list_prepend (action_layer->layers, layer);
diff --git a/poppler/Link.cc b/poppler/Link.cc
index d1d56b0b..a821b2b4 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -853,7 +853,6 @@ LinkOCGState::LinkOCGState(const Object *obj)
 
 	const char *name = obj2.getName();
 	stList = new StateList();
-	stList->list = new std::vector<Ref>();
 	if (!strcmp (name, "ON")) {
 	  stList->st = On;
 	} else if (!strcmp (name, "OFF")) {
@@ -867,7 +866,7 @@ LinkOCGState::LinkOCGState(const Object *obj)
 	}
       } else if (obj2.isRef()) {
         if (stList) {
-	  stList->list->push_back(obj2.getRef());
+	  stList->list.push_back(obj2.getRef());
 	} else {
 	  error(errSyntaxWarning, -1, "Invalid OCG Action State array, expected name instead of ref");
 	}
@@ -896,12 +895,6 @@ LinkOCGState::~LinkOCGState() {
   }
 }
 
-LinkOCGState::StateList::~StateList() {
-  if (list) {
-    delete list;
-  }
-}
-
 //------------------------------------------------------------------------
 // LinkHide
 //------------------------------------------------------------------------
diff --git a/poppler/Link.h b/poppler/Link.h
index 8b87f375..59c224f0 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -449,12 +449,12 @@ public:
 
   enum State { On, Off, Toggle};
   struct StateList {
-    StateList() { list = nullptr; }
-    ~StateList();
+    StateList() = default;
+    ~StateList() = default;
     StateList(const StateList &) = delete;
     StateList& operator=(const StateList &) = delete;
     State st;
-    std::vector<Ref> *list;
+    std::vector<Ref> list;
   };
 
   const std::vector<StateList*>& getStateList() const { return stateList; }
diff --git a/qt5/src/poppler-optcontent.cc b/qt5/src/poppler-optcontent.cc
index 177fbe04..5aac5c92 100644
--- a/qt5/src/poppler-optcontent.cc
+++ b/qt5/src/poppler-optcontent.cc
@@ -403,8 +403,8 @@ namespace Poppler
 
     const std::vector<::LinkOCGState::StateList*>& statesList = popplerLinkOCGState->getStateList();
     for (const ::LinkOCGState::StateList *stateList : statesList) {
-        const std::vector<Ref> *refsList = stateList->list;
-        for (const Ref& ref : *refsList) {
+        const std::vector<Ref>& refsList = stateList->list;
+        for (const Ref& ref : refsList) {
             OptContentItem *item = d->itemFromRef(QString::number(ref.num));
 
             if (stateList->st == ::LinkOCGState::On) {
commit 27958cb0c7ec165ab65433dd602387eb37eb7650
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Sat Dec 14 21:41:39 2019 +0100

    StateList: Replace std::vector<Ref*> by std::vector<Ref>
    
    A Ref is really just two ints.  Let's not call malloc separately
    for each of them.

diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc
index 34536782..2117693f 100644
--- a/glib/poppler-action.cc
+++ b/glib/poppler-action.cc
@@ -544,7 +544,7 @@ build_rendition (PopplerAction *action,
 static PopplerLayer *
 get_layer_for_ref (PopplerDocument *document,
 		   GList           *layers,
-		   const Ref       *ref,
+		   const Ref        ref,
 		   gboolean         preserve_rb)
 {
 	GList *l;
@@ -555,7 +555,7 @@ get_layer_for_ref (PopplerDocument *document,
 		if (layer->oc) {
 			const Ref ocgRef = layer->oc->getRef();
 
-			if (*ref == ocgRef) {
+			if (ref == ocgRef) {
 				GList *rb_group = nullptr;
 
 				if (preserve_rb)
@@ -603,7 +603,7 @@ build_ocg_state (PopplerDocument *document,
 			break;
 		}
 
-		for (const Ref *ref : (*list->list)) {
+		for (const Ref& ref : (*list->list)) {
 			PopplerLayer *layer = get_layer_for_ref (document, document->layers, ref, preserve_rb);
 
 			action_layer->layers = g_list_prepend (action_layer->layers, layer);
diff --git a/poppler/Link.cc b/poppler/Link.cc
index 4acc05eb..d1d56b0b 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -853,7 +853,7 @@ LinkOCGState::LinkOCGState(const Object *obj)
 
 	const char *name = obj2.getName();
 	stList = new StateList();
-	stList->list = new std::vector<Ref*>();
+	stList->list = new std::vector<Ref>();
 	if (!strcmp (name, "ON")) {
 	  stList->st = On;
 	} else if (!strcmp (name, "OFF")) {
@@ -867,10 +867,7 @@ LinkOCGState::LinkOCGState(const Object *obj)
 	}
       } else if (obj2.isRef()) {
         if (stList) {
-	  Ref ocgRef = obj2.getRef();
-	  Ref *item = new Ref();
-	  *item = ocgRef;
-	  stList->list->push_back(item);
+	  stList->list->push_back(obj2.getRef());
 	} else {
 	  error(errSyntaxWarning, -1, "Invalid OCG Action State array, expected name instead of ref");
 	}
@@ -901,9 +898,6 @@ LinkOCGState::~LinkOCGState() {
 
 LinkOCGState::StateList::~StateList() {
   if (list) {
-    for (auto entry : *list) {
-      delete entry;
-    }
     delete list;
   }
 }
diff --git a/poppler/Link.h b/poppler/Link.h
index b329e38a..8b87f375 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -454,7 +454,7 @@ public:
     StateList(const StateList &) = delete;
     StateList& operator=(const StateList &) = delete;
     State st;
-    std::vector<Ref*> *list;
+    std::vector<Ref> *list;
   };
 
   const std::vector<StateList*>& getStateList() const { return stateList; }
diff --git a/qt5/src/poppler-optcontent.cc b/qt5/src/poppler-optcontent.cc
index d64d2452..177fbe04 100644
--- a/qt5/src/poppler-optcontent.cc
+++ b/qt5/src/poppler-optcontent.cc
@@ -403,9 +403,9 @@ namespace Poppler
 
     const std::vector<::LinkOCGState::StateList*>& statesList = popplerLinkOCGState->getStateList();
     for (const ::LinkOCGState::StateList *stateList : statesList) {
-        const std::vector<Ref*> *refsList = stateList->list;
-        for (const Ref *ref : *refsList) {
-            OptContentItem *item = d->itemFromRef(QString::number(ref->num));
+        const std::vector<Ref> *refsList = stateList->list;
+        for (const Ref& ref : *refsList) {
+            OptContentItem *item = d->itemFromRef(QString::number(ref.num));
 
             if (stateList->st == ::LinkOCGState::On) {
               item->setState(OptContentItem::On, popplerLinkOCGState->getPreserveRB(), changedItems);
commit a5a713621649d916508e8695169df9221b2b3f9d
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Sat Dec 14 21:26:38 2019 +0100

    LinkOCGState: Replace std::vector* by std::vector
    
    The LinkOCGState has a 'stateList' member, which previously was a
    pointer to a std::vector.  As a std::vector is little more than a
    pointer itself, one may as well keep it directly within the
    LinkOCGState object.  This is what the patch does.

diff --git a/glib/poppler-action.cc b/glib/poppler-action.cc
index f6fed6ba..34536782 100644
--- a/glib/poppler-action.cc
+++ b/glib/poppler-action.cc
@@ -579,7 +579,7 @@ build_ocg_state (PopplerDocument *document,
 		 PopplerAction   *action,
 		 const LinkOCGState    *ocg_state)
 {
-	const std::vector<LinkOCGState::StateList*> *st_list = ocg_state->getStateList();
+	const std::vector<LinkOCGState::StateList*>& st_list = ocg_state->getStateList();
 	bool    preserve_rb = ocg_state->getPreserveRB();
 	GList   *layer_state = nullptr;
 
@@ -588,7 +588,7 @@ build_ocg_state (PopplerDocument *document,
 			return;
 	}
 
-	for (const LinkOCGState::StateList *list : *st_list) {
+	for (const LinkOCGState::StateList *list : st_list) {
 		PopplerActionLayer *action_layer = g_slice_new0 (PopplerActionLayer);
 
 		switch (list->st) {
diff --git a/poppler/Link.cc b/poppler/Link.cc
index 35ddfb92..4acc05eb 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -836,8 +836,9 @@ Object LinkJavaScript::createObject(XRef *xref, const GooString &js)
 //------------------------------------------------------------------------
 // LinkOCGState
 //------------------------------------------------------------------------
-LinkOCGState::LinkOCGState(const Object *obj) {
-  stateList = new std::vector<StateList*>();
+LinkOCGState::LinkOCGState(const Object *obj)
+: isValid(true)
+{
   preserveRB = true;
 
   Object obj1 = obj->dictLookup("State");
@@ -848,7 +849,7 @@ LinkOCGState::LinkOCGState(const Object *obj) {
       const Object &obj2 = obj1.arrayGetNF(i);
       if (obj2.isName()) {
         if (stList)
-	  stateList->push_back(stList);
+	  stateList.push_back(stList);
 
 	const char *name = obj2.getName();
 	stList = new StateList();
@@ -875,15 +876,15 @@ LinkOCGState::LinkOCGState(const Object *obj) {
 	}
       } else {
         error(errSyntaxWarning, -1, "Invalid item in OCG Action State array");
+        isValid = false;
       }
     }
     // Add the last group
     if (stList)
-      stateList->push_back(stList);
+      stateList.push_back(stList);
   } else {
     error(errSyntaxWarning, -1, "Invalid OCGState action");
-    delete stateList;
-    stateList = nullptr;
+    isValid = false;
   }
 
   obj1 = obj->dictLookup("PreserveRB");
@@ -893,11 +894,8 @@ LinkOCGState::LinkOCGState(const Object *obj) {
 }
 
 LinkOCGState::~LinkOCGState() {
-  if (stateList) {
-    for (auto entry : *stateList) {
-      delete entry;
-    }
-    delete stateList;
+  for (auto entry : stateList) {
+    delete entry;
   }
 }
 
diff --git a/poppler/Link.h b/poppler/Link.h
index 14665a29..b329e38a 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -443,7 +443,7 @@ public:
 
   ~LinkOCGState() override;
 
-  bool isOk() const override { return stateList != nullptr; }
+  bool isOk() const override { return isValid; }
 
   LinkActionKind getKind() const override { return actionOCGState; }
 
@@ -457,11 +457,12 @@ public:
     std::vector<Ref*> *list;
   };
 
-  const std::vector<StateList*> *getStateList() const { return stateList; }
+  const std::vector<StateList*>& getStateList() const { return stateList; }
   bool getPreserveRB() const { return preserveRB; }
 
 private:
-  std::vector<StateList*> *stateList;
+  std::vector<StateList*> stateList;
+  bool isValid;
   bool preserveRB;
 };
 
diff --git a/qt5/src/poppler-optcontent.cc b/qt5/src/poppler-optcontent.cc
index 1a659bf6..d64d2452 100644
--- a/qt5/src/poppler-optcontent.cc
+++ b/qt5/src/poppler-optcontent.cc
@@ -401,8 +401,8 @@ namespace Poppler
 
     QSet<OptContentItem *> changedItems;
 
-    const std::vector<::LinkOCGState::StateList*> *statesList = popplerLinkOCGState->getStateList();
-    for (const ::LinkOCGState::StateList *stateList : *statesList) {
+    const std::vector<::LinkOCGState::StateList*>& statesList = popplerLinkOCGState->getStateList();
+    for (const ::LinkOCGState::StateList *stateList : statesList) {
         const std::vector<Ref*> *refsList = stateList->list;
         for (const Ref *ref : *refsList) {
             OptContentItem *item = d->itemFromRef(QString::number(ref->num));


More information about the poppler mailing list