From be85954b0c424c2769f38ac5515768fd52ed7253 Mon Sep 17 00:00:00 2001 From: Felix Kauselmann Date: Sun, 13 Nov 2022 16:17:02 +0100 Subject: [PATCH 1/4] Use std::unique_ptr for pdf objects --- .../initial_comic_info_extractor.cpp | 24 ++++--------------- common/comic.cpp | 19 +++++---------- common/comic.h | 6 ++--- 3 files changed, 14 insertions(+), 35 deletions(-) diff --git a/YACReaderLibrary/initial_comic_info_extractor.cpp b/YACReaderLibrary/initial_comic_info_extractor.cpp index 2d889f4c..d25d84c4 100644 --- a/YACReaderLibrary/initial_comic_info_extractor.cpp +++ b/YACReaderLibrary/initial_comic_info_extractor.cpp @@ -27,38 +27,27 @@ void InitialComicInfoExtractor::extract() #ifndef NO_PDF if (fi.suffix().compare("pdf", Qt::CaseInsensitive) == 0) { #if defined Q_OS_MAC && defined USE_PDFKIT - MacOSXPDFComic *pdfComic = new MacOSXPDFComic(); + auto pdfComic = std::make_unique(); if (!pdfComic->openComic(_fileSource)) { - delete pdfComic; - // QImage p; - // p.load(":/images/notCover.png"); - // p.save(_target); return; } #elif defined USE_PDFIUM - auto pdfComic = new PdfiumComic(); + auto pdfComic = std::make_unique(); if (!pdfComic->openComic(_fileSource)) { - delete pdfComic; return; } #else - Poppler::Document *pdfComic = Poppler::Document::load(_fileSource); + auto _pdfComic = Poppler::Document::load(_fileSource); + auto pdfComic = std::unique_ptr(_pdfComic); #endif - if (!pdfComic) { QLOG_WARN() << "Extracting cover: unable to open PDF file " << _fileSource; - // delete pdfComic; //TODO check if the delete is needed - pdfComic = 0; - // QImage p; - // p.load(":/images/notCover.png"); - // p.save(_target); return; } #if !defined USE_PDFKIT && !defined USE_PDFIUM // poppler only, not mac if (pdfComic->isLocked()) { QLOG_WARN() << "Extracting cover: unable to open PDF file " << _fileSource; - delete pdfComic; return; } #endif @@ -75,11 +64,8 @@ void InitialComicInfoExtractor::extract() saveCover(_target, p); } else if (_target != "") { QLOG_WARN() << "Extracting cover: requested cover index greater than numPages " << _fileSource; - // QImage p; - // p.load(":/images/notCover.png"); - // p.save(_target); + } - delete pdfComic; } return; } diff --git a/common/comic.cpp b/common/comic.cpp index 69882fae..26b3949e 100644 --- a/common/comic.cpp +++ b/common/comic.cpp @@ -796,24 +796,22 @@ bool PDFComic::load(const QString &path, const ComicDB &comic) void PDFComic::process() { #if defined Q_OS_MAC && defined USE_PDFKIT - pdfComic = new MacOSXPDFComic(); + pdfComic = std::make_unique(); if (!pdfComic->openComic(_path)) { - delete pdfComic; emit errorOpening(); return; } #elif defined USE_PDFIUM - pdfComic = new PdfiumComic(); + pdfComic = std::make_unique(); if (!pdfComic->openComic(_path)) { - delete pdfComic; emit errorOpening(); return; } #else - pdfComic = Poppler::Document::load(_path); + auto _pdfComic = Poppler::Document::load(_path); + pdfComic = std::unique_ptr(_pdfComic); + if (!pdfComic) { - // delete pdfComic; - // pdfComic = 0; moveToThread(QCoreApplication::instance()->thread()); emit errorOpening(); return; @@ -824,7 +822,6 @@ void PDFComic::process() return; } - // pdfComic->setRenderHint(Poppler::Document::Antialiasing, true); pdfComic->setRenderHint(Poppler::Document::TextAntialiasing, true); #endif @@ -853,7 +850,6 @@ void PDFComic::process() int buffered_index = _index; for (int i = buffered_index; i < nPages; i++) { if (_invalidated) { - delete pdfComic; moveToThread(QCoreApplication::instance()->thread()); return; } @@ -862,14 +858,12 @@ void PDFComic::process() } for (int i = 0; i < buffered_index; i++) { if (_invalidated) { - delete pdfComic; moveToThread(QCoreApplication::instance()->thread()); return; } renderPage(i); } - delete pdfComic; moveToThread(QCoreApplication::instance()->thread()); emit imagesLoaded(); } @@ -883,10 +877,9 @@ void PDFComic::renderPage(int page) QImage img = pdfComic->getPage(page); if (!img.isNull()) { #else - Poppler::Page *pdfpage = pdfComic->page(page); + std::unique_ptr pdfpage (pdfComic->page(page)); if (pdfpage) { QImage img = pdfpage->renderToImage(150, 150); - delete pdfpage; #endif QByteArray ba; QBuffer buf(&ba); diff --git a/common/comic.h b/common/comic.h index a64da6f5..9be08d43 100644 --- a/common/comic.h +++ b/common/comic.h @@ -165,11 +165,11 @@ class PDFComic : public Comic private: // pdf #if defined Q_OS_MAC && defined USE_PDFKIT - MacOSXPDFComic *pdfComic; + std::unique_ptr pdfComic; #elif defined USE_PDFIUM - PdfiumComic *pdfComic; + std::unique_ptr pdfComic; #else - Poppler::Document *pdfComic; + std::unique_ptr pdfComic; #endif void renderPage(int page); // void run(); From 4a59dd6db6b2372b83bced20650aea2ece56ff22 Mon Sep 17 00:00:00 2001 From: Felix Kauselmann Date: Sun, 13 Nov 2022 17:05:29 +0100 Subject: [PATCH 2/4] Add support for poppler-qt6 Fixes #352 --- CHANGELOG.md | 1 + .../initial_comic_info_extractor.cpp | 3 +- common/comic.cpp | 7 +++- common/comic.h | 3 +- common/pdf_comic.h | 5 +++ dependencies/pdf_backend.pri | 33 +++++++++++++------ 6 files changed, 38 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8de31e0e..61147e86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Version counting is based on semantic versioning (Major.Feature.Patch) ### All apps * Run logger in a dedicated thread to avoid segfaults at application shutdown +* Add support for poppler-qt6 pdf backend ## 9.10 diff --git a/YACReaderLibrary/initial_comic_info_extractor.cpp b/YACReaderLibrary/initial_comic_info_extractor.cpp index d25d84c4..63ee6a5b 100644 --- a/YACReaderLibrary/initial_comic_info_extractor.cpp +++ b/YACReaderLibrary/initial_comic_info_extractor.cpp @@ -27,7 +27,7 @@ void InitialComicInfoExtractor::extract() #ifndef NO_PDF if (fi.suffix().compare("pdf", Qt::CaseInsensitive) == 0) { #if defined Q_OS_MAC && defined USE_PDFKIT - auto pdfComic = std::make_unique(); + auto pdfComic = std::make_unique(); if (!pdfComic->openComic(_fileSource)) { return; } @@ -64,7 +64,6 @@ void InitialComicInfoExtractor::extract() saveCover(_target, p); } else if (_target != "") { QLOG_WARN() << "Extracting cover: requested cover index greater than numPages " << _fileSource; - } } return; diff --git a/common/comic.cpp b/common/comic.cpp index 26b3949e..059c6203 100644 --- a/common/comic.cpp +++ b/common/comic.cpp @@ -808,8 +808,13 @@ void PDFComic::process() return; } #else + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + pdfComic = Poppler::Document::load(_path); +#else auto _pdfComic = Poppler::Document::load(_path); pdfComic = std::unique_ptr(_pdfComic); +#endif if (!pdfComic) { moveToThread(QCoreApplication::instance()->thread()); @@ -877,7 +882,7 @@ void PDFComic::renderPage(int page) QImage img = pdfComic->getPage(page); if (!img.isNull()) { #else - std::unique_ptr pdfpage (pdfComic->page(page)); + std::unique_ptr pdfpage(pdfComic->page(page)); if (pdfpage) { QImage img = pdfpage->renderToImage(150, 150); #endif diff --git a/common/comic.h b/common/comic.h index 9be08d43..ae753a4c 100644 --- a/common/comic.h +++ b/common/comic.h @@ -12,7 +12,7 @@ #include "pdf_comic.h" #endif // NO_PDF class ComicDB; -//#define EXTENSIONS << "*.jpg" << "*.jpeg" << "*.png" << "*.gif" << "*.tiff" << "*.tif" << "*.bmp" Comic::getSupportedImageFormats() + //#define EXTENSIONS_LITERAL << ".jpg" << ".jpeg" << ".png" << ".gif" << ".tiff" << ".tif" << ".bmp" //Comic::getSupportedImageLiteralFormats() class Comic : public QObject { @@ -172,6 +172,7 @@ private: std::unique_ptr pdfComic; #endif void renderPage(int page); + // void run(); public: diff --git a/common/pdf_comic.h b/common/pdf_comic.h index 13febf5c..f2d8ff8c 100644 --- a/common/pdf_comic.h +++ b/common/pdf_comic.h @@ -5,6 +5,7 @@ #include #include #include +#include #if defined Q_OS_MAC && defined USE_PDFKIT class MacOSXPDFComic @@ -45,6 +46,10 @@ private: QFile pdfFile; }; #else +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +#include +#else #include "poppler-qt5.h" +#endif // QT_VERSION #endif // Q_OS_MAC #endif // PDF_COMIC_H diff --git a/dependencies/pdf_backend.pri b/dependencies/pdf_backend.pri index a14885bb..0905ede6 100644 --- a/dependencies/pdf_backend.pri +++ b/dependencies/pdf_backend.pri @@ -55,18 +55,31 @@ CONFIG(poppler) { LIBS += -L$$PWD/poppler/dependencies/bin } if(unix|mingw):!macx { - !contains(QT_CONFIG, no-pkg-config):packagesExist(poppler-qt5) { - message("Using system provided installation of poppler-qt5 found by pkg-config.") - CONFIG += link_pkgconfig - PKGCONFIG += poppler-qt5 - } else:!macx:exists(/usr/include/poppler/qt5) { - message("Using system provided installation of poppler-qt5.") - INCLUDEPATH += /usr/include/poppler/qt5 - LIBS += -lpoppler-qt5 + greaterThan (QT_MAJOR_VERSION, 5) { + !contains(QT_CONFIG, no-pkg-config):packagesExist(poppler-qt6) { + message("Using system provided installation of poppler-qt6 found by pkg-config.") + CONFIG += link_pkgconfig + PKGCONFIG += poppler-qt6 + } else:!macx:exists(/usr/include/poppler/qt6) { + message("Using system provided installation of poppler-qt6.") + INCLUDEPATH += /usr/include/poppler/qt6 + LIBS += -lpoppler-qt6 + } else { + error("Could not find poppler-qt6") + } } else { - error("Could not find poppler-qt5") + !contains(QT_CONFIG, no-pkg-config):packagesExist(poppler-qt5) { + message("Using system provided installation of poppler-qt5 found by pkg-config.") + CONFIG += link_pkgconfig + PKGCONFIG += poppler-qt5 + } else:!macx:exists(/usr/include/poppler/qt5) { + message("Using system provided installation of poppler-qt5.") + INCLUDEPATH += /usr/include/poppler/qt5 + LIBS += -lpoppler-qt5 + } else { + error("Could not find poppler-qt5") + } } - } unix:macx { error (Poppler backend is currently not supported on macOS) From d4f12ff066f1af1bf051cecff8c3ab7da7c17ef0 Mon Sep 17 00:00:00 2001 From: Felix Kauselmann Date: Fri, 18 Nov 2022 13:45:26 +0100 Subject: [PATCH 3/4] Fix poppler-qt6 setup for initial comic extractor --- YACReaderLibrary/initial_comic_info_extractor.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/YACReaderLibrary/initial_comic_info_extractor.cpp b/YACReaderLibrary/initial_comic_info_extractor.cpp index 63ee6a5b..11288a27 100644 --- a/YACReaderLibrary/initial_comic_info_extractor.cpp +++ b/YACReaderLibrary/initial_comic_info_extractor.cpp @@ -36,9 +36,13 @@ void InitialComicInfoExtractor::extract() if (!pdfComic->openComic(_fileSource)) { return; } +#else +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + auto pdfComic = Poppler::Document::load(_fileSource); #else auto _pdfComic = Poppler::Document::load(_fileSource); - auto pdfComic = std::unique_ptr(_pdfComic); + pdfComic = std::unique_ptr(_pdfComic); +#endif #endif if (!pdfComic) { QLOG_WARN() << "Extracting cover: unable to open PDF file " << _fileSource; From 06d744e88bf793afb30bc9e6961d7641a19640db Mon Sep 17 00:00:00 2001 From: Felix Kauselmann Date: Fri, 18 Nov 2022 14:50:42 +0100 Subject: [PATCH 4/4] Fix regression in poppler-qt5 build --- YACReaderLibrary/initial_comic_info_extractor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/YACReaderLibrary/initial_comic_info_extractor.cpp b/YACReaderLibrary/initial_comic_info_extractor.cpp index 11288a27..763907f5 100644 --- a/YACReaderLibrary/initial_comic_info_extractor.cpp +++ b/YACReaderLibrary/initial_comic_info_extractor.cpp @@ -41,7 +41,7 @@ void InitialComicInfoExtractor::extract() auto pdfComic = Poppler::Document::load(_fileSource); #else auto _pdfComic = Poppler::Document::load(_fileSource); - pdfComic = std::unique_ptr(_pdfComic); + auto pdfComic = std::unique_ptr(_pdfComic); #endif #endif if (!pdfComic) {