[poppler] 2 commits - cpp/poppler-font.cpp glib/poppler-document.cc poppler/FontInfo.cc poppler/FontInfo.h qt5/src utils/pdffonts.cc

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Oct 24 12:16:15 UTC 2019


 cpp/poppler-font.cpp        |   15 ++++--------
 glib/poppler-document.cc    |   51 ++++++++++++++++++++------------------------
 poppler/FontInfo.cc         |   17 ++++++--------
 poppler/FontInfo.h          |    2 -
 qt5/src/poppler-fontinfo.cc |   13 +++--------
 utils/pdffonts.cc           |   14 ++----------
 6 files changed, 45 insertions(+), 67 deletions(-)

New commits:
commit e076a478e4d2f7d6445215814c86e6ac4654f575
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Mon Oct 14 20:08:33 2019 +0200

    Make FontInfo::scan return a std::vector object
    
    ... rather than a pointer to a std::vector.  Given that a
    std::vector is little more than a pointer and some size
    information, there is no need to create std::vector objects
    on the heap.  Returning them by value is just as fast
    (the vector content is not copied), and makes the code
    more readable, too.

diff --git a/cpp/poppler-font.cpp b/cpp/poppler-font.cpp
index df795eb9..6d833c19 100644
--- a/cpp/poppler-font.cpp
+++ b/cpp/poppler-font.cpp
@@ -218,18 +218,13 @@ std::vector<font_info> font_iterator::next()
 
     ++d->current_page;
 
-    std::vector<FontInfo*> *items = d->font_info_scanner.scan(1);
-    if (!items) {
-        return std::vector<font_info>();
-    }
-    std::vector<font_info> fonts(items->size());
-    for (std::size_t i = 0; i < items->size(); ++i) {
-        fonts[i] = font_info(*new font_info_private((*items)[i]));
-    }
-    for (auto entry : *items) {
+    const std::vector<FontInfo*> items = d->font_info_scanner.scan(1);
+    std::vector<font_info> fonts;
+    fonts.reserve(items.size());
+    for (FontInfo* entry : items) {
+        fonts.push_back(font_info(*new font_info_private(entry)));
         delete entry;
     }
-    delete items;
     return fonts;
 }
 
diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc
index fbeaf34d..22b3e4e2 100644
--- a/glib/poppler-document.cc
+++ b/glib/poppler-document.cc
@@ -4,6 +4,7 @@
  * Copyright (C) 2016 Jakub Alba <jakubalba at gmail.com>
  * Copyright (C) 2018-2019 Marek Kasik <mkasik at redhat.com>
  * Copyright (C) 2019 Masamichi Hosoda <trueroad at trueroad.jp>
+ * Copyright (C) 2019, Oliver Sander <oliver.sander at tu-dresden.de>
  *
  * 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
@@ -2718,7 +2719,7 @@ poppler_index_iter_free (PopplerIndexIter *iter)
 
 struct _PopplerFontsIter
 {
-	std::vector<FontInfo*> *items;
+	std::vector<FontInfo*> items;
 	int index;
 };
 
@@ -2740,7 +2741,7 @@ poppler_fonts_iter_get_full_name (PopplerFontsIter *iter)
 	GooString *name;
 	FontInfo *info;
 
-	info = (*iter->items)[iter->index];
+	info = iter->items[iter->index];
 
 	name = info->getName();
 	if (name != nullptr) {
@@ -2765,7 +2766,7 @@ poppler_fonts_iter_get_name (PopplerFontsIter *iter)
 	const char *name;
 
 	name = poppler_fonts_iter_get_full_name (iter);
-	info = (*iter->items)[iter->index];
+	info = iter->items[iter->index];
 
 	if (info->getSubset() && name) {
 		while (*name && *name != '+')
@@ -2795,7 +2796,7 @@ poppler_fonts_iter_get_substitute_name (PopplerFontsIter *iter)
 	GooString *name;
 	FontInfo *info;
 
-	info = (*iter->items)[iter->index];
+	info = iter->items[iter->index];
 
 	name = info->getSubstituteName();
 	if (name != nullptr) {
@@ -2820,7 +2821,7 @@ poppler_fonts_iter_get_file_name (PopplerFontsIter *iter)
 	GooString *file;
 	FontInfo *info;
 
-	info = (*iter->items)[iter->index];
+	info = iter->items[iter->index];
 
 	file = info->getFile();
 	if (file != nullptr) {
@@ -2845,7 +2846,7 @@ poppler_fonts_iter_get_font_type (PopplerFontsIter *iter)
 
 	g_return_val_if_fail (iter != nullptr, POPPLER_FONT_TYPE_UNKNOWN);
 
-	info = (*iter->items)[iter->index];
+	info = iter->items[iter->index];
 
 	return (PopplerFontType)info->getType ();
 }
@@ -2866,7 +2867,7 @@ poppler_fonts_iter_get_encoding (PopplerFontsIter *iter)
 	GooString *encoding;
 	FontInfo *info;
 
-	info = (*iter->items)[iter->index];
+	info = iter->items[iter->index];
 
 	encoding = info->getEncoding();
 	if (encoding != nullptr) {
@@ -2889,7 +2890,7 @@ poppler_fonts_iter_is_embedded (PopplerFontsIter *iter)
 {
 	FontInfo *info;
 
-	info = (*iter->items)[iter->index];
+	info = iter->items[iter->index];
 
 	return info->getEmbedded();
 }
@@ -2907,7 +2908,7 @@ poppler_fonts_iter_is_subset (PopplerFontsIter *iter)
 {
 	FontInfo *info;
 
-	info = (*iter->items)[iter->index];
+	info = iter->items[iter->index];
 
 	return info->getSubset();
 }
@@ -2926,7 +2927,7 @@ poppler_fonts_iter_next (PopplerFontsIter *iter)
 	g_return_val_if_fail (iter != nullptr, FALSE);
 
 	iter->index++;
-	if (iter->index >= (int)iter->items->size())
+	if (iter->index >= (int)iter->items.size())
 		return FALSE;
 
 	return TRUE;
@@ -2949,10 +2950,10 @@ poppler_fonts_iter_copy (PopplerFontsIter *iter)
 
 	new_iter = g_slice_dup (PopplerFontsIter, iter);
 
-	new_iter->items = new std::vector<FontInfo*> ();
-	for (std::size_t i = 0; i < iter->items->size(); i++) {
-		FontInfo *info = (*iter->items)[i];
-		new_iter->items->push_back (new FontInfo (*info));
+	new_iter->items.resize(iter->items.size());
+	for (std::size_t i = 0; i < iter->items.size(); i++) {
+		FontInfo *info = iter->items[i];
+		new_iter->items[i] = new FontInfo (*info);
 	}
 
 	return new_iter;
@@ -2970,21 +2971,21 @@ poppler_fonts_iter_free (PopplerFontsIter *iter)
 	if (G_UNLIKELY (iter == nullptr))
 		return;
 
-        for (auto entry : *iter->items) {
+        for (auto entry : iter->items) {
           delete entry;
         }
-        delete iter->items;
+        iter->items.~vector<FontInfo*>();
 
 	g_slice_free (PopplerFontsIter, iter);
 }
 
 static PopplerFontsIter *
-poppler_fonts_iter_new (std::vector<FontInfo*> *items)
+poppler_fonts_iter_new (std::vector<FontInfo*> &&items)
 {
 	PopplerFontsIter *iter;
 
 	iter = g_slice_new (PopplerFontsIter);
-	iter->items = items;
+	new ((void*)&iter->items) std::vector<FontInfo*>(std::move(items));
 	iter->index = 0;
 
 	return iter;
@@ -3083,22 +3084,18 @@ poppler_font_info_scan (PopplerFontInfo   *font_info,
 			int                n_pages,
 			PopplerFontsIter **iter)
 {
-	std::vector<FontInfo*> *items;
-
 	g_return_val_if_fail (iter != nullptr, FALSE);
 
-	items = font_info->scanner->scan(n_pages);
+	std::vector<FontInfo*> items = font_info->scanner->scan(n_pages);
 
-	if (items == nullptr) {
+	if (items.empty()) {
 		*iter = nullptr;
-	} else if (items->empty()) {
-		*iter = nullptr;
-		delete items;
+		return FALSE;
 	} else {
-		*iter = poppler_fonts_iter_new(items);
+		*iter = poppler_fonts_iter_new(std::move(items));
 	}
 	
-	return (items != nullptr);
+	return TRUE;
 }
 
 /* For backward compatibility */
diff --git a/poppler/FontInfo.cc b/poppler/FontInfo.cc
index 7dc62769..87c212ee 100644
--- a/poppler/FontInfo.cc
+++ b/poppler/FontInfo.cc
@@ -52,17 +52,17 @@ FontInfoScanner::FontInfoScanner(PDFDoc *docA, int firstPage) {
 FontInfoScanner::~FontInfoScanner() {
 }
 
-std::vector<FontInfo*> *FontInfoScanner::scan(int nPages) {
+std::vector<FontInfo*> FontInfoScanner::scan(int nPages) {
   Page *page;
   Dict *resDict;
   Annots *annots;
   int lastPage;
 
+  std::vector<FontInfo*> result;
+
   if (currentPage > doc->getNumPages()) {
-    return nullptr;
+    return result;
   }
- 
-  auto result = new std::vector<FontInfo*>();
 
   lastPage = currentPage + nPages;
   if (lastPage > doc->getNumPages() + 1) {
diff --git a/poppler/FontInfo.h b/poppler/FontInfo.h
index 6ed6fb2f..0ecef820 100644
--- a/poppler/FontInfo.h
+++ b/poppler/FontInfo.h
@@ -92,7 +92,7 @@ public:
   // Destructor.
   ~FontInfoScanner();
 
-  std::vector<FontInfo*> *scan(int nPages);
+  std::vector<FontInfo*> scan(int nPages);
 
 private:
 
diff --git a/qt5/src/poppler-fontinfo.cc b/qt5/src/poppler-fontinfo.cc
index 3948a298..6b3ae7cb 100644
--- a/qt5/src/poppler-fontinfo.cc
+++ b/qt5/src/poppler-fontinfo.cc
@@ -134,17 +134,12 @@ QList<FontInfo> FontIterator::next()
 	++d->currentPage;
 
 	QList<FontInfo> fonts;
-	std::vector<::FontInfo*> *items = d->fontInfoScanner.scan( 1 );
-	if ( !items )
-		return fonts;
-	fonts.reserve( items->size() );
-	for ( std::size_t i = 0; i < items->size(); ++i ) {
-		fonts.append( FontInfo( FontInfoData( (*items)[ i ] ) ) );
-	}
-	for ( auto entry : *items ) {
+	const std::vector<::FontInfo*> items = d->fontInfoScanner.scan( 1 );
+	fonts.reserve( items.size() );
+	for ( ::FontInfo* entry : items ) {
+		fonts.append( FontInfo( FontInfoData( entry ) ) );
 		delete entry;
 	}
-	delete items;
 
 	return fonts;
 }
diff --git a/utils/pdffonts.cc b/utils/pdffonts.cc
index 0746bc21..24eb5038 100644
--- a/utils/pdffonts.cc
+++ b/utils/pdffonts.cc
@@ -165,15 +165,13 @@ int main(int argc, char *argv[]) {
   // get the fonts
   {
     FontInfoScanner scanner(doc, firstPage - 1);
-    std::vector<FontInfo*> *fonts = scanner.scan(lastPage - firstPage + 1);
+    const std::vector<FontInfo*> fonts = scanner.scan(lastPage - firstPage + 1);
 
     if (showSubst) {
       // print the font substitutions
       printf("name                                 object ID substitute font                      substitute font file\n");
       printf("------------------------------------ --------- ------------------------------------ ------------------------------------\n");
-      if (fonts) {
-        for (std::size_t i = 0; i < fonts->size(); ++i) {
-          FontInfo *font = (*fonts)[i];
+        for (FontInfo* font : fonts) {
           if (font->getFile()) {
             printf("%-36s",
                    font->getName() ? font->getName()->c_str() : "[none]");
@@ -189,15 +187,11 @@ int main(int argc, char *argv[]) {
           }
           delete font;
         }
-        delete fonts;
-      }
     } else {
       // print the font info
       printf("name                                 type              encoding         emb sub uni object ID\n");
       printf("------------------------------------ ----------------- ---------------- --- --- --- ---------\n");
-      if (fonts) {
-        for (std::size_t i = 0; i < fonts->size(); ++i) {
-          FontInfo *font = (*fonts)[i];
+        for (FontInfo* font : fonts) {
           printf("%-36s %-17s %-16s %-3s %-3s %-3s",
                  font->getName() ? font->getName()->c_str() : "[none]",
                  fontTypeNames[font->getType()],
@@ -213,8 +207,6 @@ int main(int argc, char *argv[]) {
           }
           delete font;
         }
-        delete fonts;
-      }
     }
   }
 
commit 8911527dc38908ee56626fc55d09041475cc5145
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Mon Oct 14 15:15:45 2019 +0200

    Use a std::unique_ptr for XRef
    
    This makes memory handling a tiny bit more robust.

diff --git a/poppler/FontInfo.cc b/poppler/FontInfo.cc
index 39557894..7dc62769 100644
--- a/poppler/FontInfo.cc
+++ b/poppler/FontInfo.cc
@@ -69,27 +69,26 @@ std::vector<FontInfo*> *FontInfoScanner::scan(int nPages) {
     lastPage = doc->getNumPages() + 1;
   }
 
-  XRef *xrefA = doc->getXRef()->copy();
+  std::unique_ptr<XRef> xrefA(doc->getXRef()->copy());
   for (int pg = currentPage; pg < lastPage; ++pg) {
     page = doc->getPage(pg);
     if (!page) continue;
 
-    if ((resDict = page->getResourceDictCopy(xrefA))) {
-      scanFonts(xrefA, resDict, result);
+    if ((resDict = page->getResourceDictCopy(xrefA.get()))) {
+      scanFonts(xrefA.get(), resDict, &result);
       delete resDict;
     }
     annots = page->getAnnots();
     for (int i = 0; i < annots->getNumAnnots(); ++i) {
       Object obj1 = annots->getAnnot(i)->getAppearanceResDict();
       if (obj1.isDict()) {
-        scanFonts(xrefA, obj1.getDict(), result);
+        scanFonts(xrefA.get(), obj1.getDict(), &result);
       }
     }
   }
 
   currentPage = lastPage;
 
-  delete xrefA;
   return result;
 }
 


More information about the poppler mailing list