[arch-commits] Commit in posterazor/repos/community-x86_64 (10 files)

Allan McRae allan at gemini.archlinux.org
Mon Apr 25 02:00:17 UTC 2022


    Date: Monday, April 25, 2022 @ 02:00:17
  Author: allan
Revision: 1189794

archrelease: copy trunk to community-x86_64

Added:
  posterazor/repos/community-x86_64/PKGBUILD
    (from rev 1189793, posterazor/trunk/PKGBUILD)
  posterazor/repos/community-x86_64/posterazor.desktop
    (from rev 1189793, posterazor/trunk/posterazor.desktop)
  posterazor/repos/community-x86_64/posterazor.xpm
    (from rev 1189793, posterazor/trunk/posterazor.xpm)
  posterazor/repos/community-x86_64/qt.patch
    (from rev 1189793, posterazor/trunk/qt.patch)
  posterazor/repos/community-x86_64/update.patch
    (from rev 1189793, posterazor/trunk/update.patch)
Deleted:
  posterazor/repos/community-x86_64/PKGBUILD
  posterazor/repos/community-x86_64/posterazor.desktop
  posterazor/repos/community-x86_64/posterazor.xpm
  posterazor/repos/community-x86_64/qt.patch
  posterazor/repos/community-x86_64/update.patch

--------------------+
 PKGBUILD           |   98 -
 posterazor.desktop |   16 
 qt.patch           |   42 
 update.patch       | 4208 +++++++++++++++++++++++++--------------------------
 4 files changed, 2182 insertions(+), 2182 deletions(-)

Deleted: PKGBUILD
===================================================================
--- PKGBUILD	2022-04-25 01:59:37 UTC (rev 1189793)
+++ PKGBUILD	2022-04-25 02:00:17 UTC (rev 1189794)
@@ -1,49 +0,0 @@
-# Maintainer: Alexander F. Rødseth <xyproto at archlinux.org>
-# Contributor: Alois Nespor <alium at artixlinux.org>
-
-pkgname=posterazor
-# 1.9.7 is not yet released, but 1.9.6 does not compile.
-# After applying patches, the "about" dialog shows "1.9.7".
-pkgver=1.9.7.pre
-pkgrel=1
-pkgdesc='Cut an image or PDF into pieces which can be printed and assembled to a poster'
-arch=(x86_64)
-url='https://github.com/aportale/posterazor'
-license=(GPL)
-depends=(poppler-qt5)
-makedepends=(git)
-# branch PosteRazor_1_9_6
-source=("git+$url#commit=5ffc88db94451872da50fa3f2b526ca6c41dab1c"
-        posterazor.desktop
-        posterazor.xpm
-        qt.patch::https://github.com/aportale/posterazor/commit/004cf52db5ff79fe1a083277c743fea4ac2e8321.patch
-        update.patch)
-b2sums=('SKIP'
-        '1f7e5c55fcf7864141927308e2d2c4081b31c894d73a97937ab7fb8b5da567e1c43882fb40f27dd1d078231afd704a5a5a261bbc1751f87300c3f46cdf5a4966'
-        'b18ce8c67b02b8818596117ce9ae99852d2164e084d4a446d096501ff6bb7c0cc19aa0a0037b015a2c3897e9117ee0fd8d49f6f208cfb3e4af838f69e2b6f211'
-        '0f938dc23b3aae118b8a95a6e4fe63da005811d0484acd4a6e180335c29e74b0ed302379aef77875957be9e8d353cc19bf9ed700833fc60e23f79e4d3e213aae'
-        '12b14e86b3ad3c0e213c67995d647e83b8655663ac73a9aa52bad61268d843da67b28e0c0c247cdf1cd9b8203a5ece6b8571f83fff2f0e0a1758bc0c58101a82')
-
-prepare() {
-  cd posterazor
-  patch -p1 -i ../update.patch
-  patch -p1 -i ../qt.patch
-}
-
-build() {
-  cd posterazor/src
-  qmake-qt5 \
-    QMAKE_CFLAGS_RELEASE="$CPPFLAGS $CFLAGS" \
-    QMAKE_CXXFLAGS_RELEASE="$CPPFLAGS $CXXFLAGS" \
-    QMAKE_LFLAGS_RELEASE="$LDFLAGS" \
-    posterazor.pro
-  make
-}
-package() {
-  cd posterazor/src
-  install -Dm755 PosteRazor "$pkgdir/usr/bin/posterazor"
-  install -Dm644 "$srcdir/posterazor.desktop" \
-    "$pkgdir/usr/share/applications/posterazor.desktop"
-  install -Dm644 "$srcdir/posterazor.xpm" \
-    "$pkgdir/usr/share/icons/posterazor.xpm"
-}

Copied: posterazor/repos/community-x86_64/PKGBUILD (from rev 1189793, posterazor/trunk/PKGBUILD)
===================================================================
--- PKGBUILD	                        (rev 0)
+++ PKGBUILD	2022-04-25 02:00:17 UTC (rev 1189794)
@@ -0,0 +1,49 @@
+# Maintainer: Alexander F. Rødseth <xyproto at archlinux.org>
+# Contributor: Alois Nespor <alium at artixlinux.org>
+
+pkgname=posterazor
+# 1.9.7 is not yet released, but 1.9.6 does not compile.
+# After applying patches, the "about" dialog shows "1.9.7".
+pkgver=1.9.7.pre
+pkgrel=2
+pkgdesc='Cut an image or PDF into pieces which can be printed and assembled to a poster'
+arch=(x86_64)
+url='https://github.com/aportale/posterazor'
+license=(GPL)
+depends=(poppler-qt5)
+makedepends=(git)
+# branch PosteRazor_1_9_6
+source=("git+$url#commit=5ffc88db94451872da50fa3f2b526ca6c41dab1c"
+        posterazor.desktop
+        posterazor.xpm
+        qt.patch::https://github.com/aportale/posterazor/commit/004cf52db5ff79fe1a083277c743fea4ac2e8321.patch
+        update.patch)
+b2sums=('SKIP'
+        '1f7e5c55fcf7864141927308e2d2c4081b31c894d73a97937ab7fb8b5da567e1c43882fb40f27dd1d078231afd704a5a5a261bbc1751f87300c3f46cdf5a4966'
+        'b18ce8c67b02b8818596117ce9ae99852d2164e084d4a446d096501ff6bb7c0cc19aa0a0037b015a2c3897e9117ee0fd8d49f6f208cfb3e4af838f69e2b6f211'
+        '0f938dc23b3aae118b8a95a6e4fe63da005811d0484acd4a6e180335c29e74b0ed302379aef77875957be9e8d353cc19bf9ed700833fc60e23f79e4d3e213aae'
+        '12b14e86b3ad3c0e213c67995d647e83b8655663ac73a9aa52bad61268d843da67b28e0c0c247cdf1cd9b8203a5ece6b8571f83fff2f0e0a1758bc0c58101a82')
+
+prepare() {
+  cd posterazor
+  patch -p1 -i ../update.patch
+  patch -p1 -i ../qt.patch
+}
+
+build() {
+  cd posterazor/src
+  qmake-qt5 \
+    QMAKE_CFLAGS_RELEASE="$CPPFLAGS $CFLAGS" \
+    QMAKE_CXXFLAGS_RELEASE="$CPPFLAGS $CXXFLAGS" \
+    QMAKE_LFLAGS_RELEASE="$LDFLAGS" \
+    posterazor.pro
+  make
+}
+package() {
+  cd posterazor/src
+  install -Dm755 PosteRazor "$pkgdir/usr/bin/posterazor"
+  install -Dm644 "$srcdir/posterazor.desktop" \
+    "$pkgdir/usr/share/applications/posterazor.desktop"
+  install -Dm644 "$srcdir/posterazor.xpm" \
+    "$pkgdir/usr/share/icons/posterazor.xpm"
+}

Deleted: posterazor.desktop
===================================================================
--- posterazor.desktop	2022-04-25 01:59:37 UTC (rev 1189793)
+++ posterazor.desktop	2022-04-25 02:00:17 UTC (rev 1189794)
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Name=PosteRazor
-Comment=Make your own poster!
-Exec=/usr/bin/posterazor
-Icon=/usr/share/icons/posterazor.xpm
-Terminal=false
-Type=Application
-Categories=Application;Graphics;

Copied: posterazor/repos/community-x86_64/posterazor.desktop (from rev 1189793, posterazor/trunk/posterazor.desktop)
===================================================================
--- posterazor.desktop	                        (rev 0)
+++ posterazor.desktop	2022-04-25 02:00:17 UTC (rev 1189794)
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Name=PosteRazor
+Comment=Make your own poster!
+Exec=/usr/bin/posterazor
+Icon=/usr/share/icons/posterazor.xpm
+Terminal=false
+Type=Application
+Categories=Application;Graphics;

Deleted: posterazor.xpm
===================================================================
(Binary files differ)

Copied: posterazor/repos/community-x86_64/posterazor.xpm (from rev 1189793, posterazor/trunk/posterazor.xpm)
===================================================================
(Binary files differ)

Deleted: qt.patch
===================================================================
--- qt.patch	2022-04-25 01:59:37 UTC (rev 1189793)
+++ qt.patch	2022-04-25 02:00:17 UTC (rev 1189794)
@@ -1,21 +0,0 @@
-From 004cf52db5ff79fe1a083277c743fea4ac2e8321 Mon Sep 17 00:00:00 2001
-From: Yevgeniy Filatov <itspec.ru at gmail.com>
-Date: Sun, 28 Jun 2020 14:44:37 +0400
-Subject: [PATCH] Fixed compilation on Qt 5.15
-
----
- src/paintcanvas.cpp | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/paintcanvas.cpp b/src/paintcanvas.cpp
-index 7d3abe25..b2d9d76a 100644
---- a/src/paintcanvas.cpp
-+++ b/src/paintcanvas.cpp
-@@ -25,6 +25,7 @@
- #include <QImage>
- #include <QPainter>
- #include <QVariant>
-+#include <QPainterPath>
- 
- PaintCanvas::PaintCanvas(QWidget *parent)
-     : QWidget(parent)

Copied: posterazor/repos/community-x86_64/qt.patch (from rev 1189793, posterazor/trunk/qt.patch)
===================================================================
--- qt.patch	                        (rev 0)
+++ qt.patch	2022-04-25 02:00:17 UTC (rev 1189794)
@@ -0,0 +1,21 @@
+From 004cf52db5ff79fe1a083277c743fea4ac2e8321 Mon Sep 17 00:00:00 2001
+From: Yevgeniy Filatov <itspec.ru at gmail.com>
+Date: Sun, 28 Jun 2020 14:44:37 +0400
+Subject: [PATCH] Fixed compilation on Qt 5.15
+
+---
+ src/paintcanvas.cpp | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/paintcanvas.cpp b/src/paintcanvas.cpp
+index 7d3abe25..b2d9d76a 100644
+--- a/src/paintcanvas.cpp
++++ b/src/paintcanvas.cpp
+@@ -25,6 +25,7 @@
+ #include <QImage>
+ #include <QPainter>
+ #include <QVariant>
++#include <QPainterPath>
+ 
+ PaintCanvas::PaintCanvas(QWidget *parent)
+     : QWidget(parent)

Deleted: update.patch
===================================================================
--- update.patch	2022-04-25 01:59:37 UTC (rev 1189793)
+++ update.patch	2022-04-25 02:00:17 UTC (rev 1189794)
@@ -1,2104 +0,0 @@
-diff --git a/src/controller.cpp b/src/controller.cpp
-index b332d9a..f0307fb 100644
---- a/src/controller.cpp
-+++ b/src/controller.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -23,15 +23,22 @@
- #include "controller.h"
- #include "posterazorcore.h"
- #include "wizardcontroller.h"
-+
- #include <QAction>
- #include <QCoreApplication>
--#include <QLocale>
--#include <QSettings>
-+#include <QDesktopServices>
- #include <QFileDialog>
-+#include <QLocale>
- #include <QMessageBox>
--#include <QUrl>
--#include <QDesktopServices>
-+#include <QSettings>
- #include <QTranslator>
-+#include <QUrl>
-+
-+#ifdef Q_OS_WASM
-+#include <emscripten.h>
-+#include <emscripten/html5.h>
-+#include <QBuffer>
-+#endif // Q_OS_WASM
- 
- const QLatin1String settingsKey_LaunchPDFApplication("LaunchPDFApplication");
- const QLatin1String settingsKey_TranslationName("TranslationName");
-@@ -42,7 +49,6 @@ Controller::Controller(PosteRazorCore *posteRazorCore, QWidget *view, QObject *p
-     : QObject(parent)
-     , m_posteRazorCore(posteRazorCore)
-     , m_view(view)
--    , m_launchPDFApplication(true)
- {
-     connect(m_view, SIGNAL(paperFormatChanged(const QString&)), SLOT(setPaperFormat(const QString&)));
-     connect(m_view, SIGNAL(paperOrientationChanged(QPrinter::Orientation)), SLOT(setPaperOrientation(QPrinter::Orientation)));
-@@ -110,21 +116,19 @@ Controller::Controller(PosteRazorCore *posteRazorCore, QWidget *view, QObject *p
-         {SIGNAL(setPosterSizeModeAvailableSignal(Types::PosterSizeModes, bool)),
-                                                                     SLOT(setPosterSizeModeAvailable(Types::PosterSizeModes, bool))}
-     };
--    static const int signalsToViewSlotsConnectionsCount =
--        int(sizeof signalsToViewSlotsConnections / sizeof signalsToViewSlotsConnections[0]);
--    for (int i = 0; i < signalsToViewSlotsConnectionsCount; ++i) {
-+    for (auto &connection : signalsToViewSlotsConnections) {
-         const QByteArray slot(
--                QMetaObject::normalizedSignature(signalsToViewSlotsConnections[i].slot + 1));
-+                QMetaObject::normalizedSignature(connection.slot + 1));
-                 // + 1: Remove slot flag '1'
-         if (m_view->metaObject()->indexOfSlot(slot) != -1)
--            connect(this, signalsToViewSlotsConnections[i].signal, m_view, signalsToViewSlotsConnections[i].slot);
-+            connect(this, connection.signal, m_view, connection.slot);
-     }
- 
-     m_wizardController = new WizardController(m_view, this);
- 
-     if (!m_posteRazorCore->imageIOLibraryAboutText().isEmpty()) {
--        QAction *aboutAction = new QAction(m_view);
--        aboutAction->setText(QLatin1String("A&bout ") + m_posteRazorCore->imageIOLibraryName());
-+        auto aboutAction = new QAction(m_view);
-+        aboutAction->setText(QStringLiteral("A&bout ") + m_posteRazorCore->imageIOLibraryName());
-         connect (aboutAction, SIGNAL(triggered()), SLOT(showExtraAboutDialog()));
-         emit addAboutDialogActionSignal(aboutAction);
-     }
-@@ -413,7 +417,7 @@ void Controller::loadInputImage()
-     for (int i = 0; i < formats.count(); i++) {
-         QStringList formatWildcards;
-         foreach (const QString &extension, formats.at(i).first)
--            formatWildcards << QLatin1String("*.") + extension;
-+            formatWildcards << QStringLiteral("*.") + extension;
-         allWildcards << formatWildcards;
-         QString formatName = formats.at(i).second;
-         // Some Open File dialogs (at least OSX) ar irritated if there are brackes in the file type name
-@@ -425,27 +429,34 @@ void Controller::loadInputImage()
- 
-     QSettings loadPathSettings;
- 
--    QString loadFileName = QFileDialog::getOpenFileName (
--        m_view,
--        QCoreApplication::translate("Main window", "Load an input image"),
--        loadPathSettings.value(settingsKey_ImageLoadPath,
--#if QT_VERSION >= 0x050000
--            QStandardPaths::standardLocations(QStandardPaths::PicturesLocation).first()
--#elif QT_VERSION >= 0x040400
--            QDesktopServices::storageLocation(QDesktopServices::PicturesLocation)
-+    const QString loadPathDefault =
-+            QStandardPaths::standardLocations(QStandardPaths::PicturesLocation).constFirst();
-+#ifdef Q_OS_WASM
-+    QFileDialog::getOpenFileContent(allFilters.join(QLatin1String(";;")),
-+                                    [this](const QString &fileName, const QByteArray &fileContent) {
-+        const QString previousFileName = m_posteRazorCore->fileName();
-+        const QString copyFileName = QLatin1String("/home/web_user/") + QFileInfo(fileName).fileName();
-+
-+        QFile imageFile(copyFileName);
-+        if (imageFile.open(QIODevice::WriteOnly)) {
-+            imageFile.write(fileContent);
-+            imageFile.close();
-+        }
-+
-+        if (handleInputImageSelected(copyFileName))
-+            QFile::remove(previousFileName);
-+        else
-+            QFile::remove(copyFileName);
-+    });
- #else
--            QLatin1String(".")
--#endif
--            ).toString(),
--        allFilters.join(QLatin1String(";;"))
--    );
-+    const QString loadFileName =
-+            QFileDialog::getOpenFileName(m_view,
-+                                         QCoreApplication::translate("Main window", "Load an input image"),
-+                                         loadPathSettings.value(settingsKey_ImageLoadPath, loadPathDefault).toString(),
-+                                         allFilters.join(QLatin1String(";;")));
- 
--    if (!loadFileName.isEmpty()) {
--        const bool successful = loadInputImage(loadFileName);
--        if (successful)
--            loadPathSettings.setValue(settingsKey_ImageLoadPath,
--                QDir::toNativeSeparators(QFileInfo(loadFileName).absolutePath()));
--    }
-+    handleInputImageSelected(loadFileName);
-+#endif // QT_OS_WASM
- }
- 
- bool Controller::loadInputImage(const QString &fileName)
-@@ -471,29 +482,64 @@ bool Controller::loadInputImage(const QString &imageFileName, QString &errorMess
- 
- int Controller::savePoster(const QString &fileName) const
- {
--    const int result = m_posteRazorCore->savePoster(fileName);
-+#ifdef Q_OS_WASM
-+    QByteArray posterData;
-+    QBuffer outIODevice(&posterData);
-+    outIODevice.open(QIODevice::WriteOnly);
-+#else
-+    QFile outIODevice(fileName);
-+    if (!outIODevice.open((QIODevice::WriteOnly)))
-+        return -1;
-+#endif // Q_OS_WASM
-+
-+    const int result = m_posteRazorCore->savePoster(&outIODevice);
-+
-+#ifdef Q_OS_WASM
-+    outIODevice.close();
-+    // Snippet borrowed from my dear colleague Morten:
-+    // https://codereview.qt-project.org/c/qt/qtbase/+/228599
-+    EM_ASM_({
-+        // Make the file contents and file name hint accessible to Javascript: convert
-+        // the char * to a JavaScript string and create a subarray view into the C heap.
-+        const contentPointer = $0;
-+        const contentLength = $1;
-+        const fileNameHint = UTF8ToString($2);
-+        const fileContent = Module.HEAPU8.subarray(contentPointer, contentPointer + contentLength);
-+
-+        // Create a hidden download link and click it programatically
-+        const fileblob = new Blob([fileContent], { type : "application/octet-stream" } );
-+        var link = document.createElement("a");
-+        document.body.appendChild(link);
-+        link.download = fileNameHint;
-+        link.href = window.URL.createObjectURL(fileblob);
-+        link.style = "display:none";
-+        link.click();
-+        document.body.removeChild(link);
-+    }, posterData.constData(), posterData.length(), fileName.toUtf8().constData());
-+#else
-     if (result == 0 && m_launchPDFApplication)
-         QDesktopServices::openUrl(QUrl::fromLocalFile(fileName));
-+#endif // Q_OS_WASM
-+
-     return result;
- }
- 
- void Controller::savePoster() const
- {
-+#ifdef Q_OS_WASM
-+    savePoster(QFileInfo(m_posteRazorCore->fileName()).baseName() + QLatin1String(".pdf"));
-+    return;
-+#endif // Q_OS_WASM
-+
-     QSettings savePathSettings;
- 
-     QString saveFileName = savePathSettings.value(settingsKey_PosterSavePath,
--#if QT_VERSION >= 0x050000
--        QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)
--#elif QT_VERSION >= 0x040400
--        QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation)
--#else
--        "."
--#endif
--        ).toString() + QDir::separator()
--                     + QFileInfo(m_posteRazorCore->fileName()).baseName()
--                     + QLatin1String("-")
--                     + QCoreApplication::translate("Main window", "poster")
--                     + QLatin1String(".pdf");
-+        QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)).toString()
-+            + QDir::separator()
-+            + QFileInfo(m_posteRazorCore->fileName()).baseName()
-+            + QLatin1String("-")
-+            + QCoreApplication::translate("Main window", "poster")
-+            + QLatin1String(".pdf");
-     bool fileExistsAskUserForOverwrite = false;
- 
-     do {
-@@ -502,7 +548,7 @@ void Controller::savePoster() const
-             QCoreApplication::translate("Main window", "Save the poster"),
-             saveFileName,
-             QLatin1String("Portable Document format (*.pdf)"),
--            NULL,
-+            nullptr,
-             QFileDialog::DontConfirmOverwrite
-         );
- 
-@@ -511,7 +557,7 @@ void Controller::savePoster() const
-             if (saveFileInfo.suffix().toLower() != QLatin1String("pdf"))
-                 saveFileName.append(QLatin1String(".pdf"));
- 
--            fileExistsAskUserForOverwrite = QFileInfo(saveFileName).exists();
-+            fileExistsAskUserForOverwrite = QFileInfo::exists(saveFileName);
- 
-             if (!fileExistsAskUserForOverwrite
-                     || QMessageBox::Yes == (QMessageBox::question(m_view, QString(), QCoreApplication::translate("Main window", "The file '%1' already exists.\nDo you want to overwrite it?").arg(saveFileInfo.fileName()), QMessageBox::Yes, QMessageBox::No))
-@@ -564,10 +610,8 @@ void Controller::showExtraAboutDialog()
- {
-     const QString title = QLatin1String("About ") + m_posteRazorCore->imageIOLibraryName();
-     QMessageBox::about(
--        m_view, title,
--        QString::fromLatin1("<h3>%1</h3>%2") // QMessageBox::aboutQt() also uses <h3>
--            .arg(title)
--            .arg(Types::newlineToParagraph(m_posteRazorCore->imageIOLibraryAboutText()))
-+        m_view, title, QStringLiteral("<h3>%1</h3>%2")
-+                .arg(title, Types::newlineToParagraph(m_posteRazorCore->imageIOLibraryAboutText()))
-     );
- }
- 
-@@ -582,3 +626,19 @@ void Controller::imageSuffixSupported(const QString &suffix, bool &outIsSupporte
-         }
-     }
- }
-+
-+bool Controller::handleInputImageSelected(const QString &fileName)
-+{
-+    bool successful = false;
-+
-+    if (!fileName.isEmpty()) {
-+        successful = loadInputImage(fileName);
-+        if (successful) {
-+            QSettings loadPathSettings;
-+            loadPathSettings.setValue(settingsKey_ImageLoadPath,
-+                QDir::toNativeSeparators(QFileInfo(fileName).absolutePath()));
-+        }
-+    }
-+
-+    return successful;
-+}
-diff --git a/src/controller.h b/src/controller.h
-index 73c6059..3c436be 100644
---- a/src/controller.h
-+++ b/src/controller.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,7 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef CONTROLLER_H
--#define CONTROLLER_H
-+#pragma once
- 
- #include "types.h"
- #include <QObject>
-@@ -40,7 +39,7 @@ class Controller: public QObject
-     Q_OBJECT
- 
- public:
--    Controller(PosteRazorCore *posteRazorCore, QWidget *view, QObject *parent = 0);
-+    Controller(PosteRazorCore *posteRazorCore, QWidget *view, QObject *parent = nullptr);
- 
-     void updateDialog();
-     void updatePreview();
-@@ -123,11 +122,11 @@ private slots:
-     void imageSuffixSupported(const QString &suffix, bool &outIsSupported) const;
- 
- protected:
--    PosteRazorCore *m_posteRazorCore;
--    QWidget *m_view;
--    bool m_launchPDFApplication;
--    WizardController *m_wizardController;
--    QTranslator *m_translator;
-+    PosteRazorCore *m_posteRazorCore = nullptr;
-+    QWidget *m_view = nullptr;
-+    bool m_launchPDFApplication = true;
-+    WizardController *m_wizardController = nullptr;
-+    QTranslator *m_translator = nullptr;
-     QString m_translationName;
- 
-     void setDialogSaveOptions();
-@@ -140,6 +139,5 @@ protected:
-     void setDialogImageInfoFields();
-     void setDialogOverlappingDimensions();
-     void setDialogOverlappingOptions();
-+    bool handleInputImageSelected(const QString &fileName);
- };
--
--#endif // CONTROLLER_H
-diff --git a/src/imageloaderfreeimage.cpp b/src/imageloaderfreeimage.cpp
-index 44d6699..157fb6d 100644
---- a/src/imageloaderfreeimage.cpp
-+++ b/src/imageloaderfreeimage.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -22,10 +22,12 @@
- 
- #include "FreeImage.h"
- #include "imageloaderfreeimage.h"
--#include <qendian.h>
--#include <QStringList>
-+
- #include <QColor>
--#include <math.h>
-+#include <QStringList>
-+#include <qendian.h>
-+
-+#include <cmath>
- 
- static QString FreeImageErrorMessage;
- 
-@@ -52,11 +54,6 @@ public:
- 
- ImageLoaderFreeImage::ImageLoaderFreeImage(QObject *parent)
-     : QObject(parent)
--    , m_bitmap(NULL)
--    , m_widthPixels(0)
--    , m_heightPixels(0)
--    , m_horizontalDotsPerMeter(0)
--    , m_verticalDotsPerMeter(0)
- {
-     const static FreeImageInitializer initializer;
- }
-@@ -70,7 +67,7 @@ void ImageLoaderFreeImage::disposeImage()
- {
-     if (m_bitmap) {
-         FreeImage_Unload(m_bitmap);
--        m_bitmap = NULL;
-+        m_bitmap = nullptr;
-     }
- }
- 
-@@ -92,7 +89,7 @@ bool ImageLoaderFreeImage::loadInputImage(const QString &imageFileName, QString
-             && type != FIT_RGB16 // 16bpp Greyscale, 48bpp Rgb
-             ) {
-             FreeImage_Unload(newImage);
--            newImage = NULL;
-+            newImage = nullptr;
-         }
-     }
- 
-@@ -131,7 +128,7 @@ bool ImageLoaderFreeImage::loadInputImage(const QString &imageFileName, QString
- 
- bool ImageLoaderFreeImage::isImageLoaded() const
- {
--    return (m_bitmap != NULL);
-+    return (m_bitmap != nullptr);
- }
- 
- bool ImageLoaderFreeImage::isJpeg() const
-@@ -177,8 +174,8 @@ const QImage ImageLoaderFreeImage::imageAsRGB(const QSize &size) const
-     const QSize sizePixels = this->sizePixels();
- 
-     FIBITMAP* originalImage = m_bitmap;
--    FIBITMAP* temp24BPPImage = NULL;
--    FIBITMAP* scaledImage = NULL;
-+    FIBITMAP* temp24BPPImage = nullptr;
-+    FIBITMAP* scaledImage = nullptr;
- 
-     if (!(isRGB24 || isARGB32)) {
-         if (colorDataType() == Types::ColorTypeCMYK) {
-@@ -272,7 +269,7 @@ const QByteArray ImageLoaderFreeImage::bits() const
-     char *destination = result.data();
-     FreeImage_ConvertToRawBits((BYTE*)destination, m_bitmap, bytesPerLine, bitsPerPixel(), FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, hasFreeImageVersionCorrectTopDownInConvertBits());
- 
--    const unsigned long numberOfPixels = m_widthPixels * m_heightPixels;
-+    const unsigned int numberOfPixels = m_widthPixels * m_heightPixels;
- #if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
-     if (colorDataType() == Types::ColorTypeRGB && bitsPerPixel() == 24) {
-         for (unsigned int pixelIndex = 0; pixelIndex < numberOfPixels; pixelIndex++) {
-@@ -283,7 +280,7 @@ const QByteArray ImageLoaderFreeImage::bits() const
-             pixelPtr+=3;
-         }
-     } else if (colorDataType() == Types::ColorTypeRGBA && bitsPerPixel() == 32) {
--        unsigned int* argbDestination = (unsigned int*)destination;
-+        auto argbDestination = (unsigned int*)destination;
-         for (unsigned int pixelIndex = 0; pixelIndex < numberOfPixels; pixelIndex++) {
-             *argbDestination = qToBigEndian(*argbDestination);
-             argbDestination++;
-@@ -293,7 +290,7 @@ const QByteArray ImageLoaderFreeImage::bits() const
-     if (colorDataType() == Types::ColorTypeRGB && bitsPerPixel() == 48) {
-         // Apparently, the 48 bit data has to be reordered on Windows and ppc/i386 OSX
-         // TODO: So maybe this swap belongs into the PDFwriter. Investigate.
--        unsigned short* rgb48Destination = (unsigned short*)destination;
-+        auto rgb48Destination = (unsigned short*)destination;
-         const unsigned long numberOfSwaps = numberOfPixels * 3; // Words are swapped
-         for (unsigned int pixelIndex = 0; pixelIndex < numberOfSwaps; pixelIndex++) {
-             *rgb48Destination = qToBigEndian(*rgb48Destination);
-diff --git a/src/imageloaderfreeimage.h b/src/imageloaderfreeimage.h
-index bf705c7..647f79b 100644
---- a/src/imageloaderfreeimage.h
-+++ b/src/imageloaderfreeimage.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,7 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef IMAGELOADERFREEIMAGE_H
--#define IMAGELOADERFREEIMAGE_H
-+#pragma once
- 
- #include "imageloaderinterface.h"
- 
-@@ -30,36 +29,34 @@ struct FIBITMAP;
- class ImageLoaderFreeImage: public QObject, public ImageLoaderInterface
- {
- public:
--    ImageLoaderFreeImage(QObject *parent = 0);
--    ~ImageLoaderFreeImage();
--
--    bool loadInputImage(const QString &imageFileName, QString &errorMessage);
--    bool isImageLoaded() const;
--    bool isJpeg() const;
--    QString fileName() const;
--    QSize sizePixels() const;
--    qreal horizontalDotsPerUnitOfLength(Types::UnitsOfLength unit) const;
--    qreal verticalDotsPerUnitOfLength(Types::UnitsOfLength unit) const;
--    QSizeF size(Types::UnitsOfLength unit) const;
--    const QImage imageAsRGB(const QSize &size) const;
--    int bitsPerPixel() const;
--    Types::ColorTypes colorDataType() const;
--    const QByteArray bits() const;
--    const QVector<QRgb> colorTable() const;
--    const QVector<QPair<QStringList, QString> > &imageFormats() const;
--    QString libraryName() const;
--    QString libraryAboutText() const;
-+    ImageLoaderFreeImage(QObject *parent = nullptr);
-+    ~ImageLoaderFreeImage() override;
-+
-+    bool loadInputImage(const QString &imageFileName, QString &errorMessage) override;
-+    bool isImageLoaded() const override;
-+    bool isJpeg() const override;
-+    QString fileName() const override;
-+    QSize sizePixels() const override;
-+    qreal horizontalDotsPerUnitOfLength(Types::UnitsOfLength unit) const override;
-+    qreal verticalDotsPerUnitOfLength(Types::UnitsOfLength unit) const override;
-+    QSizeF size(Types::UnitsOfLength unit) const override;
-+    const QImage imageAsRGB(const QSize &size) const override;
-+    int bitsPerPixel() const override;
-+    Types::ColorTypes colorDataType() const override;
-+    const QByteArray bits() const override;
-+    const QVector<QRgb> colorTable() const override;
-+    const QVector<QPair<QStringList, QString> > &imageFormats() const override;
-+    QString libraryName() const override;
-+    QString libraryAboutText() const override;
- 
- private:
--    FIBITMAP*    m_bitmap;
--    int          m_widthPixels;
--    int          m_heightPixels;
--    unsigned int m_horizontalDotsPerMeter;
--    unsigned int m_verticalDotsPerMeter;
--    QString      m_imageFileName;
-+    FIBITMAP* m_bitmap = nullptr;
-+    int m_widthPixels = 0;
-+    int m_heightPixels = 0;
-+    unsigned int m_horizontalDotsPerMeter = 0;
-+    unsigned int m_verticalDotsPerMeter = 0;
-+    QString m_imageFileName;
- 
-     void disposeImage();
-     static bool hasFreeImageVersionCorrectTopDownInConvertBits();
- };
--
--#endif // IMAGELOADERFREEIMAGE_H
-diff --git a/src/imageloaderinterface.h b/src/imageloaderinterface.h
-index 18e7848..419aafb 100644
---- a/src/imageloaderinterface.h
-+++ b/src/imageloaderinterface.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,7 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef IMAGELOADERINTERFACE_H
--#define IMAGELOADERINTERFACE_H
-+#pragma once
- 
- #include "types.h"
- #include <QImage>
-@@ -33,7 +32,7 @@ QT_END_NAMESPACE
- class ImageLoaderInterface
- {
- public:
--    virtual ~ImageLoaderInterface() {}
-+    virtual ~ImageLoaderInterface() = default;
- 
-     virtual bool loadInputImage(const QString &imageFileName, QString &errorMessage) = 0;
-     virtual bool isImageLoaded() const = 0;
-@@ -52,5 +51,3 @@ public:
-     virtual QString libraryName() const = 0;
-     virtual QString libraryAboutText() const = 0;
- };
--
--#endif // IMAGELOADERINTERFACE_H
-diff --git a/src/imageloaderqt.cpp b/src/imageloaderqt.cpp
-index ec53caa..0f4c53f 100644
---- a/src/imageloaderqt.cpp
-+++ b/src/imageloaderqt.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -21,11 +21,12 @@
- */
- 
- #include "imageloaderqt.h"
-+
- #include <QImageReader>
- #ifdef POPPLER_QT5_LIB
- #include <poppler-qt5.h>
- #endif
--#include <math.h>
-+#include <cmath>
- 
- ImageLoaderQt::ImageLoaderQt(QObject *parent)
-     : QObject(parent)
-@@ -51,7 +52,7 @@ bool ImageLoaderQt::loadPdf(const QString &imageFileName, QString &errorMessage)
- 
-     // FIXME: Allow user to select page (currrently hard-wired to first page).
-     Poppler::Page* pdfPage = document->page(0); // Document starts at page 0
--    if (pdfPage == 0)
-+    if (pdfPage == nullptr)
-       return false;
- 
-     // FIXME: Don't hard-wire the resolution, and display correct resolution!
-@@ -114,7 +115,10 @@ qreal ImageLoaderQt::verticalDotsPerUnitOfLength(Types::UnitsOfLength unit) cons
- QSizeF ImageLoaderQt::size(Types::UnitsOfLength unit) const
- {
-     const QSize sizePixels = this->sizePixels();
--    return QSizeF(sizePixels.width() / horizontalDotsPerUnitOfLength(unit), sizePixels.height() / verticalDotsPerUnitOfLength(unit));
-+    return {
-+        sizePixels.width() / horizontalDotsPerUnitOfLength(unit),
-+        sizePixels.height() / verticalDotsPerUnitOfLength(unit)
-+    };
- }
- 
- const QImage ImageLoaderQt::imageAsRGB(const QSize &size) const
-@@ -212,17 +216,16 @@ const QVector<QPair<QStringList, QString> > &ImageLoaderQt::imageFormats() const
-             {QLatin1String("xbm"),      QLatin1String("X11 Bitmap")},
-             {QLatin1String("xpm"),      QLatin1String("X11 Pixmap")}
-         };
--        const int extensionListCount = int(sizeof extensionList / sizeof extensionList[0]);
-         const QList<QByteArray> supportedFormats = QImageReader::supportedImageFormats();
--        for (int i = 0; i < extensionListCount; i++) {
--            QStringList extensions = extensionList[i].extensions.split(QLatin1Char(' '));
-+        for (auto &format : extensionList) {
-+            QStringList extensions = format.extensions.split(QLatin1Char(' '));
-             foreach (const QString &extension, extensions)
-                 if (supportedFormats.contains(extension.toLatin1())
- #ifdef POPPLER_QT5_LIB
-                     || (extension.toLatin1() == "pdf")
- #endif
-                     ) {
--                    formats.append(QPair<QStringList, QString> (extensions, extensionList[i].description));
-+                    formats.append({extensions, format.description});
-                     break;
-                 }
-         }
-diff --git a/src/imageloaderqt.h b/src/imageloaderqt.h
-index 2dbedab..c7a11a7 100644
---- a/src/imageloaderqt.h
-+++ b/src/imageloaderqt.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,7 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef IMAGELOADERQT_H
--#define IMAGELOADERQT_H
-+#pragma once
- 
- #include "imageloaderinterface.h"
- #include <QObject>
-@@ -29,25 +28,25 @@
- class ImageLoaderQt: public QObject, public ImageLoaderInterface
- {
- public:
--    ImageLoaderQt(QObject *parent = 0);
--
--    bool loadInputImage(const QString &imageFileName, QString &errorMessage);
--    bool isImageLoaded() const;
--    bool isJpeg() const;
--    QString fileName() const;
--    QSize sizePixels() const;
--    qreal horizontalDotsPerUnitOfLength(Types::UnitsOfLength unit) const;
--    qreal verticalDotsPerUnitOfLength(Types::UnitsOfLength unit) const;
--    QSizeF size(Types::UnitsOfLength unit) const;
--    const QImage imageAsRGB(const QSize &size) const;
--    int bitsPerPixel() const;
--    Types::ColorTypes colorDataType() const;
-+    ImageLoaderQt(QObject *parent = nullptr);
-+
-+    bool loadInputImage(const QString &imageFileName, QString &errorMessage) override;
-+    bool isImageLoaded() const override;
-+    bool isJpeg() const override;
-+    QString fileName() const override;
-+    QSize sizePixels() const override;
-+    qreal horizontalDotsPerUnitOfLength(Types::UnitsOfLength unit) const override;
-+    qreal verticalDotsPerUnitOfLength(Types::UnitsOfLength unit) const override;
-+    QSizeF size(Types::UnitsOfLength unit) const override;
-+    const QImage imageAsRGB(const QSize &size) const override;
-+    int bitsPerPixel() const override;
-+    Types::ColorTypes colorDataType() const override;
-     int savePoster(const QString &fileName, const PainterInterface *painter, int pagesCount, const QSizeF &sizeCm) const;
--    const QByteArray bits() const;
--    const QVector<QRgb> colorTable() const;
--    const QVector<QPair<QStringList, QString> > &imageFormats() const;
--    QString libraryName() const;
--    QString libraryAboutText() const;
-+    const QByteArray bits() const override;
-+    const QVector<QRgb> colorTable() const override;
-+    const QVector<QPair<QStringList, QString> > &imageFormats() const override;
-+    QString libraryName() const override;
-+    QString libraryAboutText() const override;
- 
-     void setQImage(const QImage &image);
- 
-@@ -59,5 +58,3 @@ private:
-     QImage m_image;
-     QString m_imageFileName;
- };
--
--#endif // IMAGELOADERQT_H
-diff --git a/src/main.cpp b/src/main.cpp
-index f509461..fdafc5a 100644
---- a/src/main.cpp
-+++ b/src/main.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,8 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#include "mainwindow.h"
- #include "controller.h"
-+#include "mainwindow.h"
- #include "posterazorcore.h"
- #if defined (FREEIMAGE_LIB)
- #   include "imageloaderfreeimage.h"
-@@ -31,12 +31,6 @@
- 
- #include <QtGui>
- 
--#if !defined(QT_SHARED) && !defined(QT_DLL) && !defined(FREEIMAGE_LIB)
--Q_IMPORT_PLUGIN(qgif)
--Q_IMPORT_PLUGIN(qjpeg)
--Q_IMPORT_PLUGIN(qtiff)
--#endif
--
- int main (int argc, char **argv)
- {
-     QApplication a(argc, argv);
-@@ -73,9 +67,7 @@ int main (int argc, char **argv)
- #else
- 
-     QCoreApplication::setApplicationName(QLatin1String("PosteRazor"));
--#if QT_VERSION >= 0x040400
--    QCoreApplication::setApplicationVersion(QLatin1String("1.9.5"));
--#endif
-+    QCoreApplication::setApplicationVersion(QLatin1String("1.9.7"));
-     QCoreApplication::setOrganizationName(QLatin1String("CasaPortale"));
-     QCoreApplication::setOrganizationDomain(QLatin1String("de.casaportale"));
- 
-@@ -106,6 +98,8 @@ int main (int argc, char **argv)
-     dialog.writeSettings(&settings);
-     controller.writeSettings(&settings);
- 
-+    qDebug() << "supportedImageFormats" << QImageWriter::supportedImageFormats();
-+
-     return appReturn;
- #endif
- }
-diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
-index 818cdd0..66c60b2 100644
---- a/src/mainwindow.cpp
-+++ b/src/mainwindow.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -21,19 +21,20 @@
- */
- 
- #include "mainwindow.h"
--#include <QSignalMapper>
--#include <QFileDialog>
--#include <QTranslator>
--#include <QtDebug>
--#include <QVBoxLayout>
-+
- #include <QDialogButtonBox>
--#include <QTextBrowser>
--#include <QMessageBox>
--#include <QSettings>
--#include <QMetaMethod>
- #include <QDragEnterEvent>
- #include <QDropEvent>
-+#include <QFileDialog>
-+#include <QMessageBox>
-+#include <QMetaMethod>
- #include <QMimeData>
-+#include <QSettings>
-+#include <QSignalMapper>
-+#include <QTextBrowser>
-+#include <QTranslator>
-+#include <QVBoxLayout>
-+#include <QtDebug>
- 
- const QLatin1String settingsKey_MainWindowGeometry("MainWindowGeometry");
- 
-@@ -41,10 +42,7 @@ static QString applicationNameWithVersion()
- {
-     return
-         QCoreApplication::applicationName()
--#if QT_VERSION >= 0x040400
--        + QLatin1Char(' ') + QCoreApplication::applicationVersion()
--#endif
--    ;
-+        + QLatin1Char(' ') + QCoreApplication::applicationVersion() ;
- }
- 
- MainWindow::MainWindow(QWidget *parent)
-@@ -84,7 +82,7 @@ void MainWindow::dragEnterEvent(QDragEnterEvent *event)
- {
-     const QMimeData *mimeData = event->mimeData();
-     if (mimeData->hasUrls()) {
--        const QUrl url = mimeData->urls().first();
-+        const QUrl url = mimeData->urls().constFirst();
-         const QString localFile = url.toLocalFile();
-         const QString fileSuffix = QFileInfo(localFile).suffix();
-         bool suffixIsSupported = false;
-@@ -225,8 +223,7 @@ void MainWindow::updateImageInfoFields(const QSize &inputImageSizeInPixels, cons
- 
- void MainWindow::setCurrentTranslation(const QString &translation)
- {
--    QAction *translationAction = NULL;
--    translationAction = m_translationActions.value(translation);
-+    QAction *translationAction = m_translationActions.value(translation);
-     if (!translationAction) {
-         // On a Swiss system 'translation' may be "de_CH". So let's fall back to "de"
-         const QString translationLanguage = translation.split(QLatin1Char('_')).first();
-@@ -314,7 +311,7 @@ void MainWindow::showManual(const QString &title, const QString &text)
-     dialog->setWindowFlags(dialog->windowFlags() ^ Qt::WindowContextHelpButtonHint);
-     dialog->resize(500, 400);
-     dialog->setLayout(new QVBoxLayout);
--    QTextBrowser *browser = new QTextBrowser;
-+    auto browser = new QTextBrowser;
-     browser->setOpenExternalLinks(true);
-     browser->document()->setDefaultStyleSheet(QLatin1String(
-         "dt {font-weight: bold;}"
-@@ -324,7 +321,7 @@ void MainWindow::showManual(const QString &title, const QString &text)
-         "h2 {margin-top: 18px; margin-bottom: 6px;}"));
-     browser->setHtml(text);
-     dialog->layout()->addWidget(browser);
--    QDialogButtonBox *buttonBox = new QDialogButtonBox;
-+    auto buttonBox = new QDialogButtonBox;
-     buttonBox->setStandardButtons(QDialogButtonBox::Ok);
-     connect(buttonBox, SIGNAL(accepted ()), dialog, SLOT(accept()));
-     dialog->layout()->addWidget(buttonBox);
-@@ -380,9 +377,8 @@ void MainWindow::createConnections()
-         SIGNAL(needsPaint(PaintCanvasInterface*, const QVariant&)),
-         SIGNAL(imageLoaded()),
-     };
--    static const int relayedSignalsCount = int(sizeof relayedSignals / sizeof relayedSignals[0]);
--    for (int i = 0; i < relayedSignalsCount; ++i)
--        connect(m_wizard, relayedSignals[i], relayedSignals[i]);
-+    for (auto signal : relayedSignals)
-+        connect(m_wizard, signal, signal);
- }
- 
- void MainWindow::populateUI()
-@@ -399,7 +395,7 @@ void MainWindow::populateUI()
- 
-     m_menuSettings->addSeparator();
- 
--    QActionGroup *translationActions = new QActionGroup(m_menuSettings);
-+    auto translationActions = new QActionGroup(m_menuSettings);
-     connect (translationActions, SIGNAL(triggered(QAction*)), SLOT(handleTranslationAction(QAction*)));
-     translationActions->setExclusive(true);
-     const QDir translationDir(QLatin1String(":/Translations/"));
-@@ -463,7 +459,7 @@ void MainWindow::showAboutPosteRazorDialog()
-         QLatin1String("<h2>License</h2>"
-             "<p>PosteRazor - Make your own poster!<br/>"
-             "posterazor.sourceforge.net<br/>"
--            "Copyright (C) 2005-2009 by Alessandro Portale</p>"
-+            "Copyright (C) 2005-2018 by Alessandro Portale</p>"
-             "<p>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 the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p>"
-             "<p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p>"
-             "<p>You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p>");
-diff --git a/src/mainwindow.h b/src/mainwindow.h
-index e7bcf97..607ca0f 100644
---- a/src/mainwindow.h
-+++ b/src/mainwindow.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,7 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef MAINWINDOW_H
--#define MAINWINDOW_H
-+#pragma once
- 
- #include "ui_mainwindow.h"
- 
-@@ -36,13 +35,13 @@ class MainWindow : public QMainWindow, private Ui::MainWindow
-     Q_OBJECT
- 
- public:
--    MainWindow(QWidget *parent = 0);
-+    MainWindow(QWidget *parent = nullptr);
- 
-     void retranslateUi();
-     void retranslateUiWithDimensionUnit();
--    void changeEvent(QEvent *event);
--    void dragEnterEvent(QDragEnterEvent *event);
--    void dropEvent(QDropEvent *event);
-+    void changeEvent(QEvent *event) override;
-+    void dragEnterEvent(QDragEnterEvent *event) override;
-+    void dropEvent(QDropEvent *event) override;
- 
- public slots:
-     void setPaperFormat(const QString &format);
-@@ -83,9 +82,9 @@ public slots:
-     void showManual(const QString &title, const QString &text);
- 
- private:
--    PosteRazorCore *m_posteRazor;
-+    PosteRazorCore *m_posteRazor = nullptr;
-     QString m_currentUnitOfLength;
--    QActionGroup *m_unitOfLengthActions;
-+    QActionGroup *m_unitOfLengthActions = nullptr;
-     QHash<QString, QAction*> m_translationActions;
- 
-     void createConnections();
-@@ -132,5 +131,3 @@ private slots:
-     void showAboutQtDialog() const;
-     void showAboutPosteRazorDialog();
- };
--
--#endif // MAINWINDOW_H
-diff --git a/src/paintcanvas.cpp b/src/paintcanvas.cpp
-index 8a4bc0b..7d3abe2 100644
---- a/src/paintcanvas.cpp
-+++ b/src/paintcanvas.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -21,13 +21,13 @@
- */
- 
- #include "paintcanvas.h"
-+
- #include <QImage>
- #include <QPainter>
- #include <QVariant>
- 
- PaintCanvas::PaintCanvas(QWidget *parent)
-     : QWidget(parent)
--    , m_qPainter(NULL)
-     , m_state(QLatin1String("image"))
- {
- }
-@@ -39,7 +39,7 @@ void PaintCanvas::paintEvent(QPaintEvent *event)
-     m_qPainter = &painter;
-     m_qPainter->setRenderHint(QPainter::Antialiasing);
-     emit needsPaint(this, m_state);
--    m_qPainter = NULL;
-+    m_qPainter = nullptr;
- }
- 
- void PaintCanvas::drawFilledRect(const QRectF &rect, const QBrush &brush)
-diff --git a/src/paintcanvas.h b/src/paintcanvas.h
-index a848c69..92ba3bc 100644
---- a/src/paintcanvas.h
-+++ b/src/paintcanvas.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,7 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef PAINTCANVAS_H
--#define PAINTCANVAS_H
-+#pragma once
- 
- #include <QWidget>
- #include "paintcanvasinterface.h"
-@@ -37,18 +36,18 @@ class PaintCanvas: public QWidget, public PaintCanvasInterface
- 
- private:
-     QImage m_image;
--    QPainter *m_qPainter;
-+    QPainter *m_qPainter = nullptr;
-     QString m_state;
- 
- public:
-     PaintCanvas(QWidget *parent);
- 
--    void paintEvent(QPaintEvent *event);
--    void drawFilledRect(const QRectF &rect, const QBrush &brush);
--    QSizeF size() const;
--    void drawImage(const QRectF &rect);
-+    void paintEvent(QPaintEvent *event) override;
-+    void drawFilledRect(const QRectF &rect, const QBrush &brush) override;
-+    QSizeF size() const override;
-+    void drawImage(const QRectF &rect) override;
-     void setState(const QString &state);
--    void drawOverlayText(const QPointF &position, int flags, int size, const QString &text);
-+    void drawOverlayText(const QPointF &position, int flags, int size, const QString &text) override;
- 
- public slots:
-     void setImage(const QImage &image);
-@@ -56,5 +55,3 @@ public slots:
- signals:
-     void needsPaint(PaintCanvasInterface *paintDevice, const QVariant &options) const;
- };
--
--#endif // PAINTCANVAS_H
-diff --git a/src/paintcanvasinterface.h b/src/paintcanvasinterface.h
-index c0c88c1..d625ecd 100644
---- a/src/paintcanvasinterface.h
-+++ b/src/paintcanvasinterface.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,7 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef PAINTCANVASINTERFACE_H
--#define PAINTCANVASINTERFACE_H
-+#pragma once
- 
- #include <QBrush>
- #include <QSizeF>
-@@ -30,12 +29,10 @@
- class PaintCanvasInterface
- {
- public:
--    virtual ~PaintCanvasInterface() {}
-+    virtual ~PaintCanvasInterface() = default;
- 
-     virtual void drawFilledRect(const QRectF &rect, const QBrush &brush) = 0;
-     virtual QSizeF size() const = 0;
-     virtual void drawImage(const QRectF &rect) = 0;
-     virtual void drawOverlayText(const QPointF &position, int flags, int size, const QString &text) = 0;
- };
--
--#endif // PAINTCANVASINTERFACE_H
-diff --git a/src/pdfwriter.cpp b/src/pdfwriter.cpp
-index 863517f..057e89e 100644
---- a/src/pdfwriter.cpp
-+++ b/src/pdfwriter.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -22,11 +22,13 @@
- 
- #include "paintcanvasinterface.h"
- #include "pdfwriter.h"
--#include <QRectF>
-+
- #include <QBrush>
-+#include <QDateTime>
- #include <QFile>
- #include <QFileInfo>
--#include <QDateTime>
-+#include <QRectF>
-+
- #define LINEFEED "\x0A"
- 
- const int valuePrecision = 4;
-@@ -40,14 +42,6 @@ static qreal cm2Pt(qreal cm)
- 
- PDFWriter::PDFWriter(QObject *parent)
-     : QObject(parent)
--    , m_outputFile(NULL)
--    , m_pdfObjectCount(0)
--    , m_objectPagesID(0)
--    , m_firstPageID(5) // will be ++ed if the image has a SMask
--    , m_objectResourcesID(0)
--    , m_objectImageID(0)
--    , m_mediaboxWidth(5000.0)
--    , m_mediaboxHeight(5000.0)
- {
- }
- 
-@@ -349,22 +343,17 @@ int PDFWriter::finishPage()
-     return err;
- }
- 
--int PDFWriter::startSaving(const QString &fileName, int pages, qreal widthCm, qreal heightCm)
-+int PDFWriter::startSaving(QIODevice *outputDevice, int pages, qreal widthCm, qreal heightCm)
- {
-     int err = 0;
- 
-     m_mediaboxWidth = cm2Pt(widthCm);
-     m_mediaboxHeight = cm2Pt(heightCm);
- 
--    if (m_outputFile) {
--        m_outputFile->close();
--        delete m_outputFile;
--    }
--    m_outputFile = new QFile(fileName, this);
--    if (!m_outputFile->open(QIODevice::WriteOnly))
--        return 1;
-+    if (m_outStream.device())
-+        m_outStream.device()->close();
- 
--    m_outStream.setDevice(m_outputFile);
-+    m_outStream.setDevice(outputDevice);
-     m_contentPagesCount = pages;
-     m_xref.clear();
-     m_outStream << "%PDF-1.3" LINEFEED
-@@ -451,7 +440,7 @@ void PDFWriter::drawFilledRect(const QRectF& rect, const QBrush &brush)
- 
- QSizeF PDFWriter::size() const
- {
--    return QSizeF();
-+    return {};
- }
- 
- void PDFWriter::drawImage(const QRectF &rect)
-diff --git a/src/pdfwriter.h b/src/pdfwriter.h
-index c0d6d8b..a6f379c 100644
---- a/src/pdfwriter.h
-+++ b/src/pdfwriter.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,22 +20,17 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef PDFWRITER_H
--#define PDFWRITER_H
-+#pragma once
- 
- #include "types.h"
- #include "paintcanvasinterface.h"
- #include <QRgb>
- #include <QTextStream>
- 
--QT_BEGIN_NAMESPACE
--class QFile;
--QT_END_NAMESPACE
--
- class PDFWriter: public QObject, public PaintCanvasInterface
- {
- public:
--    PDFWriter(QObject *parent = 0);
-+    PDFWriter(QObject *parent = nullptr);
- 
-     void addOffsetToXref();
-     int addImageResourcesAndXObject();
-@@ -43,26 +38,23 @@ public:
-     int saveImage(const QByteArray &imageData, const QSize &sizePixels, int bitPerPixel, Types::ColorTypes colorType, const QVector<QRgb> &colorTable);
-     int startPage();
-     int finishPage();
--    int startSaving(const QString &fileName, int pages, qreal widthCm, qreal heightCm);
-+    int startSaving(QIODevice *outputDevice, int pages, qreal widthCm, qreal heightCm);
-     int finishSaving();
--    void drawFilledRect(const QRectF&, const QBrush &brush);
--    QSizeF size() const;
--    void drawImage(const QRectF &rect);
--    void drawOverlayText(const QPointF &position, int flags, int size, const QString &text);
-+    void drawFilledRect(const QRectF&, const QBrush &brush) override;
-+    QSizeF size() const override;
-+    void drawImage(const QRectF &rect) override;
-+    void drawOverlayText(const QPointF &position, int flags, int size, const QString &text) override;
- 
- private:
--    QFile *m_outputFile;
-     QString m_xref;
--    int m_pdfObjectCount;
--    int m_contentPagesCount;
--    int m_objectPagesID;
--    int m_firstPageID;
--    int m_objectResourcesID;
--    int m_objectImageID;
--    qreal m_mediaboxWidth;
--    qreal m_mediaboxHeight;
-+    int m_pdfObjectCount = 0;
-+    int m_contentPagesCount = 0;
-+    int m_objectPagesID = 0;
-+    int m_firstPageID = 5; // will be ++ed if the image has a SMask
-+    int m_objectResourcesID = 0;
-+    int m_objectImageID = 0;
-+    qreal m_mediaboxWidth = 5000.0;
-+    qreal m_mediaboxHeight = 5000.0;
-     QString m_pageContent;
-     QTextStream m_outStream;
- };
--
--#endif // PDFWRITER_H
-diff --git a/src/posterazor.pro b/src/posterazor.pro
-index f88d3c3..2bd1a69 100644
---- a/src/posterazor.pro
-+++ b/src/posterazor.pro
-@@ -1,6 +1,6 @@
- TARGET = PosteRazor
- 
--isEqual(QT_MAJOR_VERSION, 5):QT += widgets printsupport
-+QT += widgets printsupport
- 
- DESTDIR = $$PWD
- 
-@@ -65,14 +65,6 @@ contains (DEFINES, FREEIMAGE_LIB) {
- 
-     unix:LIBS += \
-         -lfreeimage
--} else {
--    contains(CONFIG, static) {
--        QTPLUGIN += \
--            qgif \
--            qjpeg \
--            qsvg \
--            qtiff
--    }
- }
- 
- include (posterazor.pri)
-diff --git a/src/posterazorcore.cpp b/src/posterazorcore.cpp
-index e2a4117..3542e44 100644
---- a/src/posterazorcore.cpp
-+++ b/src/posterazorcore.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,17 +20,20 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#include "posterazorcore.h"
- #include "pdfwriter.h"
-+#include "posterazorcore.h"
- #if defined (FREEIMAGE_LIB)
- #    include "imageloaderfreeimage.h"
- #else
- #    include "imageloaderqt.h"
- #endif
-+
-+#include <QBrush>
-+#include <QFile>
- #include <QSettings>
- #include <QStringList>
--#include <QBrush>
--#include <math.h>
-+
-+#include <cmath>
- 
- const QLatin1String defaultValue_PaperFormat(           "DIN A4");
- 
-@@ -55,23 +58,7 @@ const QLatin1String settingsKey_UnitOfLength(           "UnitOfLength");
- PosteRazorCore::PosteRazorCore(ImageLoaderInterface *imageLoader, QObject *parent)
-     : QObject(parent)
-     , m_imageLoader(imageLoader)
--    , m_posterSizeMode(Types::PosterSizeModePages)
--    , m_posterDimension(2.0)
--    , m_posterDimensionIsWidth(true)
--    , m_posterAlignment(Qt::AlignCenter)
--    , m_usesCustomPaperSize(false)
-     , m_paperFormat(defaultValue_PaperFormat)
--    , m_paperOrientation(QPrinter::Portrait)
--    , m_paperBorderTop(1.5)
--    , m_paperBorderRight(1.5)
--    , m_paperBorderBottom(1.5)
--    , m_paperBorderLeft(1.5)
--    , m_customPaperWidth(20)
--    , m_customPaperHeight(20)
--    , m_overlappingWidth(1.0)
--    , m_overlappingHeight(1.0)
--    , m_overlappingPosition(Qt::AlignBottom | Qt::AlignRight)
--    , m_unitOfLength(Types::UnitOfLengthCentimeter)
- {
-     Q_ASSERT(m_imageLoader);
- }
-@@ -142,7 +129,7 @@ qreal PosteRazorCore::convertDistanceToCm(qreal distance) const
- 
- QSizeF PosteRazorCore::convertSizeToCm(const QSizeF &size) const
- {
--    return QSizeF(convertDistanceToCm(size.width()), convertDistanceToCm(size.height()));
-+    return {convertDistanceToCm(size.width()), convertDistanceToCm(size.height())};
- }
- 
- qreal PosteRazorCore::convertCmToDistance(qreal cm) const
-@@ -152,7 +139,7 @@ qreal PosteRazorCore::convertCmToDistance(qreal cm) const
- 
- QSizeF PosteRazorCore::convertCmToSize(const QSizeF &sizeInCm) const
- {
--    return QSizeF(convertCmToDistance(sizeInCm.width()), convertCmToDistance(sizeInCm.height()));
-+    return {convertCmToDistance(sizeInCm.width()), convertCmToDistance(sizeInCm.height())};
- }
- 
- bool PosteRazorCore::loadInputImage(const QString &imageFileName, QString &errorMessage)
-@@ -314,10 +301,10 @@ QSizeF PosteRazorCore::customPaperSize() const
-     const qreal minimalPaperHeight = minimalPaperWidth;
-     const qreal maximalPaperWidth = 500.0; // 5 meter = maximum of a PDF page.
-     const qreal maximalPaperHeight = maximalPaperWidth;
--    return QSizeF(
-+    return {
-         convertCmToDistance(qBound(minimalPaperWidth, m_customPaperWidth, maximalPaperWidth)),
-         convertCmToDistance(qBound(minimalPaperHeight, m_customPaperHeight, maximalPaperHeight))
--    );
-+    };
- }
- 
- void PosteRazorCore::setUseCustomPaperSize(bool useIt)
-@@ -338,10 +325,10 @@ QSizeF PosteRazorCore::paperSize() const
- 
- QSizeF PosteRazorCore::printablePaperAreaSize() const
- {
--    return QSizeF(
-+    return {
-         paperSize().width() - paperBorderLeft() - paperBorderRight(),
-         paperSize().height() - paperBorderTop() - paperBorderBottom()
--    );
-+    };
- }
- 
- qreal PosteRazorCore::convertBetweenAbsoluteAndPagesPosterDimension(qreal dimension, bool pagesToAbsolute, bool width) const
-@@ -371,7 +358,7 @@ qreal PosteRazorCore::convertBetweenAbsoluteAndPagesPosterDimension(qreal dimens
-         if (posterDimension >= printablePaperAreaDimension) {
-             posterDimension -= printablePaperAreaDimension;
-             posterDimensionPages += 1.0;
--        } else if (posterDimension < printablePaperAreaDimension) {
-+        } else {
-             posterDimensionPages = posterDimension / printablePaperAreaDimension;
-             posterDimension = 0;
-         }
-@@ -481,12 +468,7 @@ qreal PosteRazorCore::posterDimension(Types::PosterSizeModes mode, bool width) c
- {
-     qreal posterDimension = (width == m_posterDimensionIsWidth) ? m_posterDimension : calculateOtherPosterDimension();
- 
--    posterDimension = qMax(
--        (mode == Types::PosterSizeModeAbsolute) ? 0.001
--        : (mode == Types::PosterSizeModePages) ? 0.001
--        : 0.001
--        , posterDimension
--    );
-+    posterDimension = qMax(0.001 , posterDimension);
- 
-     // anything to convert?
-     if (posterSizeMode() != mode){
-@@ -519,7 +501,7 @@ qreal PosteRazorCore::posterDimension(Types::PosterSizeModes mode, bool width) c
- 
- QSizeF PosteRazorCore::posterSize(Types::PosterSizeModes mode) const
- {
--    return QSizeF(posterDimension(mode, true), posterDimension(mode, false));
-+    return {posterDimension(mode, true), posterDimension(mode, false)};
- }
- 
- Types::PosterSizeModes PosteRazorCore::posterSizeMode() const
-@@ -649,13 +631,13 @@ void PosteRazorCore::paintPosterOnCanvasOverlapped(PaintCanvasInterface *paintCa
-         QRectF(
-             QPointF(
-                 (
--                    alignment & Qt::AlignLeft ? borderLeft
--                    : alignment & Qt::AlignHCenter ? qBound(borderLeft, (boxSize.width() - imageSize.width()) / 2, borderLeft + posterPrintableAreaSize.width() - imageSize.width())
-+                    (alignment & Qt::AlignLeft) ? borderLeft
-+                    : (alignment & Qt::AlignHCenter) ? qBound(borderLeft, (boxSize.width() - imageSize.width()) / 2, borderLeft + posterPrintableAreaSize.width() - imageSize.width())
-                     : (borderLeft + posterPrintableAreaSize.width() - imageSize.width())
-                 ) + offset.x(),
-                 (
--                    alignment & Qt::AlignTop ? borderTop
--                    : alignment & Qt::AlignVCenter ? qBound(borderTop, (boxSize.height() - imageSize.height()) / 2, borderTop + posterPrintableAreaSize.height() - imageSize.height())
-+                    (alignment & Qt::AlignTop) ? borderTop
-+                    : (alignment & Qt::AlignVCenter) ? qBound(borderTop, (boxSize.height() - imageSize.height()) / 2, borderTop + posterPrintableAreaSize.height() - imageSize.height())
-                     : (borderTop + posterPrintableAreaSize.height() - imageSize.height())
-                 ) + offset.y()
-             ),
-@@ -737,14 +719,14 @@ void PosteRazorCore::paintPosterPageOnCanvas(PaintCanvasInterface *paintCanvas,
-     );
-     const Qt::Alignment alignment = posterAlignment();
-     qreal imageOffsetFromLeftPosterBorderCm = (
--        alignment & Qt::AlignRight ? posterTotalSizeCm.width() - posterImageSizeCm.width() - borderLeftCm
--        : alignment & Qt::AlignHCenter ? (posterTotalSizeCm.width() - posterImageSizeCm.width()) / 2 - borderLeftCm
-+        (alignment & Qt::AlignRight) ? posterTotalSizeCm.width() - posterImageSizeCm.width() - borderLeftCm
-+        : (alignment & Qt::AlignHCenter) ? (posterTotalSizeCm.width() - posterImageSizeCm.width()) / 2 - borderLeftCm
-         : -borderLeftCm
-     );
-     imageOffsetFromLeftPosterBorderCm = qBound(.0, imageOffsetFromLeftPosterBorderCm, posterTotalSizeCm.width() - posterImageSizeCm.width() - borderLeftCm - borderRightCm);
-     qreal imageOffsetFromTopPosterBorderCm = (
--        alignment & Qt::AlignBottom ? posterTotalSizeCm.height() - posterImageSizeCm.height() - borderTopCm
--        : alignment & Qt::AlignVCenter ? (posterTotalSizeCm.height() - posterImageSizeCm.height()) / 2 - borderTopCm
-+        (alignment & Qt::AlignBottom) ? posterTotalSizeCm.height() - posterImageSizeCm.height() - borderTopCm
-+        : (alignment & Qt::AlignVCenter) ? (posterTotalSizeCm.height() - posterImageSizeCm.height()) / 2 - borderTopCm
-         : -borderTopCm
-     );
-     imageOffsetFromTopPosterBorderCm = qBound(.0, imageOffsetFromTopPosterBorderCm, posterTotalSizeCm.height() - posterImageSizeCm.height() - borderTopCm - borderBottomCm);
-@@ -783,7 +765,7 @@ void PosteRazorCore::paintOnCanvas(PaintCanvasInterface *paintCanvas, const QVar
-     }
- }
- 
--int PosteRazorCore::savePoster(const QString &fileName) const
-+int PosteRazorCore::savePoster(QIODevice *outputDevice) const
- {
-     int err = 0;
- 
-@@ -794,7 +776,7 @@ int PosteRazorCore::savePoster(const QString &fileName) const
-     const QByteArray imageData = m_imageLoader->bits();
- 
-     PDFWriter pdfWriter;
--    err = pdfWriter.startSaving(fileName, pagesCount, sizeCm.width(), sizeCm.height());
-+    err = pdfWriter.startSaving(outputDevice, pagesCount, sizeCm.width(), sizeCm.height());
-     if (!err) {
-         if (m_imageLoader->isJpeg())
-             err = pdfWriter.saveJpegImage(m_imageLoader->fileName(), imageSize, m_imageLoader->colorDataType());
-diff --git a/src/posterazorcore.h b/src/posterazorcore.h
-index 27c30f8..b7c5ee8 100644
---- a/src/posterazorcore.h
-+++ b/src/posterazorcore.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,7 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef POSTERAZORCORE_H
--#define POSTERAZORCORE_H
-+#pragma once
- 
- #include "types.h"
- #include "paintcanvasinterface.h"
-@@ -38,7 +37,7 @@ class PosteRazorCore: public QObject
-     Q_OBJECT
- 
- public:
--    PosteRazorCore(ImageLoaderInterface *imageLoader, QObject *parent = 0);
-+    PosteRazorCore(ImageLoaderInterface *imageLoader, QObject *parent = nullptr);
- 
-     static unsigned int imageBitsPerLineCount(int widthPixels, int bitPerPixel);
-     static unsigned int imageBytesPerLineCount(int widthPixels, int bitPerPixel);
-@@ -47,7 +46,7 @@ public:
-     void readSettings(const QSettings *settings);
-     void writeSettings(QSettings *settings) const;
-     bool loadInputImage(const QString &imageFileName, QString &errorMessage);
--    int savePoster(const QString &fileName) const;
-+    int savePoster(QIODevice *outputDevice) const;
- 
-     QSize inputImageSizePixels() const;
-     qreal inputImageHorizontalDpi() const;
-@@ -127,24 +126,22 @@ signals:
-     void previewImageChanged(const QImage &image) const;
- 
- private:
--    ImageLoaderInterface*    m_imageLoader;
--    Types::PosterSizeModes   m_posterSizeMode;
--    qreal                   m_posterDimension;
--    bool                     m_posterDimensionIsWidth;
--    Qt::Alignment            m_posterAlignment;
--    bool                     m_usesCustomPaperSize;
--    QString                  m_paperFormat;
--    QPrinter::Orientation    m_paperOrientation;
--    qreal                   m_paperBorderTop;
--    qreal                   m_paperBorderRight;
--    qreal                   m_paperBorderBottom;
--    qreal                   m_paperBorderLeft;
--    qreal                   m_customPaperWidth;
--    qreal                   m_customPaperHeight;
--    qreal                   m_overlappingWidth;
--    qreal                   m_overlappingHeight;
--    Qt::Alignment            m_overlappingPosition;
--    Types::UnitsOfLength     m_unitOfLength;
-+    ImageLoaderInterface* m_imageLoader = nullptr;
-+    Types::PosterSizeModes m_posterSizeMode = Types::PosterSizeModePages;
-+    qreal m_posterDimension = 2.0;
-+    bool m_posterDimensionIsWidth = true;
-+    Qt::Alignment m_posterAlignment = Qt::AlignCenter;
-+    bool m_usesCustomPaperSize = false;
-+    QString m_paperFormat;
-+    QPrinter::Orientation m_paperOrientation = QPrinter::Portrait;
-+    qreal m_paperBorderTop = 1.5;
-+    qreal m_paperBorderRight = 1.5;
-+    qreal m_paperBorderBottom = 1.5;
-+    qreal m_paperBorderLeft = 1.5;
-+    qreal m_customPaperWidth = 20.0;
-+    qreal m_customPaperHeight = 20.0;
-+    qreal m_overlappingWidth = 1.0;
-+    qreal m_overlappingHeight = 1.0;
-+    Qt::Alignment m_overlappingPosition = Qt::AlignBottom | Qt::AlignRight;
-+    Types::UnitsOfLength m_unitOfLength = Types::UnitOfLengthCentimeter;
- };
--
--#endif // POSTERAZORCORE_H
-diff --git a/src/snapspinbox.cpp b/src/snapspinbox.cpp
-index 838fa75..f454521 100644
---- a/src/snapspinbox.cpp
-+++ b/src/snapspinbox.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -24,7 +24,6 @@
- 
- SnapSpinBox::SnapSpinBox(QWidget *parent)
-     : QDoubleSpinBox(parent)
--    , m_originalValue(.0)
- {
-     connect((const QObject *)lineEdit(), SIGNAL(textEdited(const QString &)), SLOT(handleLineEditTextEdited(const QString &)));
- }
-diff --git a/src/snapspinbox.h b/src/snapspinbox.h
-index ca499ec..608578b 100644
---- a/src/snapspinbox.h
-+++ b/src/snapspinbox.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,7 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef SNAPSPINBOX_H
--#define SNAPSPINBOX_H
-+#pragma once
- 
- #include <QDoubleSpinBox>
- 
-@@ -39,15 +38,13 @@ public:
-     void setValue(qreal value);
- 
- protected:
--    qreal m_originalValue; // This is not rounded
--    QAbstractSpinBox::StepEnabled stepEnabled() const;
-+    qreal m_originalValue = 0.0; // This is not rounded
-+    QAbstractSpinBox::StepEnabled stepEnabled() const override;
- 
- private slots:
-     void handleLineEditTextEdited(const QString &text);
--    void stepBy(int steps);
-+    void stepBy(int steps) override;
- 
- signals:
-     void valueEdited(qreal value) const;
- };
--
--#endif // SNAPSPINBOX_H
-diff --git a/src/tst_posterazor.cpp b/src/tst_posterazor.cpp
-index 8ee9398..c951533 100644
---- a/src/tst_posterazor.cpp
-+++ b/src/tst_posterazor.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -33,12 +33,6 @@
- #include <QtGui>
- #include <QtWidgets>
- 
--#if !defined(QT_SHARED) && !defined(QT_DLL) && !defined(FREEIMAGE_LIB)
--Q_IMPORT_PLUGIN(qgif)
--Q_IMPORT_PLUGIN(qjpeg)
--Q_IMPORT_PLUGIN(qtiff)
--#endif
--
- class PosteRazorTests: public QObject
- {
-     Q_OBJECT
-@@ -60,9 +54,7 @@ const QColor PosteRazorTests::m_screenShotBackground = Qt::white;
- void PosteRazorTests::initTestCase()
- {
-     QCoreApplication::setApplicationName("PosteRazor");
--#if QT_VERSION >= 0x040400
--    QCoreApplication::setApplicationVersion("1.9.5");
--#endif
-+    QCoreApplication::setApplicationVersion("1.9.7");
-     QCoreApplication::setOrganizationName("CasaPortale");
-     QCoreApplication::setOrganizationDomain("de.casaportale");
- }
-@@ -92,10 +84,10 @@ void PosteRazorTests::screenShotterize()
-         QTest::qWaitForWindowExposed(&window);
-         QTest::qWait(500); // Wait for fancy effects to finish
- 
--        QPushButton *nextButton = window.findChild<QPushButton*>(QString::fromLatin1("m_stepNextButton"));
--        QTabWidget *paperFormatCustomTabs = window.findChild<QTabWidget*>(QString::fromLatin1("m_paperFormatTypeTabs"));
--        QWidget *paperFormatStandardTab = window.findChild<QWidget*>(QString::fromLatin1("m_paperFormatStandardTab"));
--        QWidget *paperFormatCustomTab = window.findChild<QWidget*>(QString::fromLatin1("m_paperFormatCustomTab"));
-+        auto nextButton = window.findChild<QPushButton*>(QString::fromLatin1("m_stepNextButton"));
-+        auto paperFormatCustomTabs = window.findChild<QTabWidget*>(QString::fromLatin1("m_paperFormatTypeTabs"));
-+        auto paperFormatStandardTab = window.findChild<QWidget*>(QString::fromLatin1("m_paperFormatStandardTab"));
-+        auto paperFormatCustomTab = window.findChild<QWidget*>(QString::fromLatin1("m_paperFormatCustomTab"));
- 
-         const QString screenShotFileNameTemplate =
-                 QString::fromLatin1("ScreenShot-%1-%2-%3.png")
-@@ -128,7 +120,7 @@ void PosteRazorTests::screenShotterize()
- 
- static inline bool imageRowHasUniqueColor(const QImage &image, int row, const QColor &color)
- {
--    const QRgb *rowData = reinterpret_cast<const QRgb*>(image.scanLine(row));
-+    auto rowData = reinterpret_cast<const QRgb*>(image.scanLine(row));
-     const QRgb colorRgba = color.rgba();
-     for (int i = 0; i < image.width(); ++i)
-         if (*(rowData++) != colorRgba)
-diff --git a/src/tst_posterazor.pro b/src/tst_posterazor.pro
-index 383d048..f9cd1a8 100644
---- a/src/tst_posterazor.pro
-+++ b/src/tst_posterazor.pro
-@@ -24,16 +24,6 @@ contains (DEFINES, FREEIMAGE_LIB) {
- 
-     unix:LIBS += \
-         -lfreeimage
--} else {
--    contains(CONFIG, static) {
--        QTPLUGIN += \
--            qgif \
--            qjpeg \
--            qsvg \
--            qtiff
--    }
- }
- 
- include (posterazor.pri)
--
--!contains(CONFIG, build_pass) system(lrelease posterazor.pro)
-diff --git a/src/types.cpp b/src/types.cpp
-index 98edad1..c8302ca 100644
---- a/src/types.cpp
-+++ b/src/types.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -21,29 +21,20 @@
- */
- 
- #include "types.h"
--#include <QtDebug>
-+
- #include <QRegExp>
-+#include <QtDebug>
- 
- const QHash<Types::UnitsOfLength, QPair<QString, qreal> > &Types::unitsOfLength()
- {
--    static QHash<UnitsOfLength, QPair<QString, qreal> > units;
--    if (units.empty()) {
--        static const struct {
--            UnitsOfLength unit;
--            QString name;
--            qreal cm;
--        } unitsOfLength[] = {
--            {UnitOfLengthMeter,      QLatin1String("m"),        100.00},
--            {UnitOfLengthMillimeter, QLatin1String("mm"),         0.10},
--            {UnitOfLengthCentimeter, QLatin1String("cm"),         1.00},
--            {UnitOfLengthInch,       QLatin1String("in"),         2.54},
--            {UnitOfLengthFeet,       QLatin1String("ft"), 2.54 * 12.00},
--            {UnitOfLengthPoints,     QLatin1String("pt"), 2.54 / 72.00}
--        };
--        static const int unitsOfLengthCount = int(sizeof unitsOfLength / sizeof unitsOfLength[0]);
--        for (int i = 0; i < unitsOfLengthCount; i++)
--            units.insert(unitsOfLength[i].unit, QPair<QString, qreal> (unitsOfLength[i].name, unitsOfLength[i].cm));
--    }
-+    const static QHash<UnitsOfLength, QPair<QString, qreal> > units = {
-+        {UnitOfLengthMeter,         {QLatin1String("m"),        100.00}},
-+        {UnitOfLengthMillimeter,    {QLatin1String("mm"),         0.10}},
-+        {UnitOfLengthCentimeter,    {QLatin1String("cm"),         1.00}},
-+        {UnitOfLengthInch,          {QLatin1String("in"),         2.54}},
-+        {UnitOfLengthFeet,          {QLatin1String("ft"), 2.54 * 12.00}},
-+        {UnitOfLengthPoints,        {QLatin1String("pt"), 2.54 / 72.00}}
-+    };
-     return units;
- }
- 
-@@ -61,10 +52,10 @@ qreal Types::convertBetweenUnitsOfLength(qreal distance, UnitsOfLength sourceUni
- 
- QSizeF Types::convertBetweenUnitsOfLength(const QSizeF &size, UnitsOfLength sourceUnit, UnitsOfLength targetUnit)
- {
--    return QSizeF(
-+    return {
-         convertBetweenUnitsOfLength(size.width(), sourceUnit, targetUnit),
-         convertBetweenUnitsOfLength(size.height(), sourceUnit, targetUnit)
--    );
-+    };
- }
- 
- Types::UnitsOfLength Types::unitOfLenthFromString(const QString &string)
-@@ -80,23 +71,14 @@ Types::UnitsOfLength Types::unitOfLenthFromString(const QString &string)
- 
- const QHash<QString, QSizeF> &Types::paperFormats()
- {
--    static QHash<QString, QSizeF> formats;
--    if (formats.empty()) {
--        static const struct {
--            QString name;
--            qreal width;
--            qreal height;
--        } paperFormats[] = {
--            {QLatin1String("DIN A4"),    21.0, 29.7},
--            {QLatin1String("DIN A3"),    29.7, 42.0},
--            {QLatin1String("Legal"),     21.6, 35.6},
--            {QLatin1String("Letter"),    21.6, 27.9},
--            {QLatin1String("Tabloid"),   27.9, 43.2}
--        };
--        static const int paperFormatsCount = int(sizeof paperFormats / sizeof paperFormats[0]);
--        for (int i = 0; i < paperFormatsCount; i++)
--            formats.insert(paperFormats[i].name, QSizeF(paperFormats[i].width, paperFormats[i].height));
--    }
-+    const static QHash<QString, QSizeF> formats =
-+    {
-+        {QLatin1String("DIN A4"),   {21.0, 29.7}},
-+        {QLatin1String("DIN A3"),   {29.7, 42.0}},
-+        {QLatin1String("Legal"),    {21.6, 35.6}},
-+        {QLatin1String("Letter"),   {21.6, 27.9}},
-+        {QLatin1String("Tabloid"),  {27.9, 43.2}}
-+    };
-     return formats;
- }
- 
-diff --git a/src/types.h b/src/types.h
-index a7d87ef..b426201 100644
---- a/src/types.h
-+++ b/src/types.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,7 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef TYPES_H
--#define TYPES_H
-+#pragma once
- 
- #include <QPair>
- #include <QPrinter>
-@@ -65,5 +64,3 @@ public:
-     static QString cleanString(const QString &dirtyString);
-     static QString newlineToParagraph(const QString &nlText);
- };
--
--#endif // TYPES_H
-diff --git a/src/wizard.cpp b/src/wizard.cpp
-index e0aa8bf..e5159b6 100644
---- a/src/wizard.cpp
-+++ b/src/wizard.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -21,12 +21,13 @@
- */
- 
- #include "wizard.h"
--#include <QSignalMapper>
--#include <QFileInfo>
--#include <QtDebug>
--#include <QVBoxLayout>
-+
- #include <QDialogButtonBox>
-+#include <QFileInfo>
- #include <QMessageBox>
-+#include <QSignalMapper>
-+#include <QVBoxLayout>
-+#include <QtDebug>
- 
- Wizard::Wizard(QWidget *parent)
-     : QWidget(parent)
-@@ -38,42 +39,34 @@ Wizard::Wizard(QWidget *parent)
-     m_stepHelpButton->setMinimumSize(m_imageLoadButton->sizeHint());
-     m_savePosterButton->setIcon(QApplication::style()->standardPixmap(QStyle::SP_DialogSaveButton));
- 
--    const struct {
--        QAbstractButton *sender;
--        Qt::Alignment alignment;
--    } alignmentMap[] = {
--        {m_posterAlignmentTopLeftButton,     Qt::AlignTop | Qt::AlignLeft        },
--        {m_posterAlignmentTopButton,         Qt::AlignTop | Qt::AlignHCenter     },
--        {m_posterAlignmentTopRightButton,    Qt::AlignTop | Qt::AlignRight       },
--        {m_posterAlignmentLeftButton,        Qt::AlignVCenter | Qt::AlignLeft    },
--        {m_posterAlignmentCenterButton,      Qt::AlignCenter                     },
--        {m_posterAlignmentRightButton,       Qt::AlignVCenter | Qt::AlignRight   },
--        {m_posterAlignmentBottomLeftButton,  Qt::AlignBottom | Qt::AlignLeft     },
--        {m_posterAlignmentBottomButton,      Qt::AlignBottom | Qt::AlignHCenter  },
--        {m_posterAlignmentBottomRightButton, Qt::AlignBottom | Qt::AlignRight    }
-+    m_overlappingButtons = {
-+        {Qt::AlignTop | Qt::AlignLeft,          m_overlappingPositionTopLeftButton      },
-+        {Qt::AlignTop | Qt::AlignRight,         m_overlappingPositionTopRightButton     },
-+        {Qt::AlignBottom | Qt::AlignLeft,       m_overlappingPositionBottomLeftButton   },
-+        {Qt::AlignBottom | Qt::AlignRight,      m_overlappingPositionBottomRightButton  }
-     };
--    static const int alignmentMapCount = int(sizeof alignmentMap / sizeof alignmentMap[0]);
--    for (int i = 0; i < alignmentMapCount; i++)
--        m_alignmentButtons.insert(alignmentMap[i].alignment, alignmentMap[i].sender);
--
--    const struct {
--        QAbstractButton *sender;
--        Qt::Alignment alignment;
--    } overlappingMap[] = {
--        {m_overlappingPositionTopLeftButton,     Qt::AlignTop | Qt::AlignLeft     },
--        {m_overlappingPositionTopRightButton,    Qt::AlignTop | Qt::AlignRight    },
--        {m_overlappingPositionBottomLeftButton,  Qt::AlignBottom | Qt::AlignLeft  },
--        {m_overlappingPositionBottomRightButton, Qt::AlignBottom | Qt::AlignRight }
-+
-+    m_alignmentButtons = {
-+        {Qt::AlignTop | Qt::AlignLeft,          m_posterAlignmentTopLeftButton          },
-+        {Qt::AlignTop | Qt::AlignHCenter,       m_posterAlignmentTopButton              },
-+        {Qt::AlignTop | Qt::AlignRight,         m_posterAlignmentTopRightButton         },
-+        {Qt::AlignVCenter | Qt::AlignLeft,      m_posterAlignmentLeftButton             },
-+        {Qt::AlignCenter,                       m_posterAlignmentCenterButton           },
-+        {Qt::AlignVCenter | Qt::AlignRight,     m_posterAlignmentRightButton            },
-+        {Qt::AlignBottom | Qt::AlignLeft,       m_posterAlignmentBottomLeftButton       },
-+        {Qt::AlignBottom | Qt::AlignHCenter,    m_posterAlignmentBottomButton           },
-+        {Qt::AlignBottom | Qt::AlignRight,      m_posterAlignmentBottomRightButton      }
-     };
--    static const int overlappingMapCount = int(sizeof overlappingMap / sizeof overlappingMap[0]);
--    for (int i = 0; i < overlappingMapCount; i++)
--        m_overlappingButtons.insert(overlappingMap[i].alignment, overlappingMap[i].sender);
- 
-     m_steps->setCurrentIndex(0);
-     createConnections();
-     populateUI();
-     updatePosterSizeGroupsState();
-     retranslateUi();
-+
-+#ifdef Q_OS_WASM
-+    m_launchPDFApplicationCheckBox->hide();
-+#endif // Q_OS_WASM
- }
- 
- void Wizard::changeEvent(QEvent *event)
-@@ -407,11 +400,11 @@ void Wizard::createConnections()
-     connect(m_posterSizePercentualRadioButton,      SIGNAL(clicked()),                  SLOT(updatePosterSizeGroupsState()));
-     connect(m_overlappingWidthInput,                SIGNAL(valueEdited(qreal)),        SIGNAL(overlappingWidthChanged(qreal)));
-     connect(m_overlappingHeightInput,               SIGNAL(valueEdited(qreal)),        SIGNAL(overlappingHeightChanged(qreal)));
--    QSignalMapper *overlappingMapper = new QSignalMapper(this);
--    foreach (const Qt::Alignment alignment, m_overlappingButtons.keys()) {
--        QAbstractButton *sender = m_overlappingButtons.value(alignment);
-+    auto overlappingMapper = new QSignalMapper(this);
-+    for (auto it = m_overlappingButtons.cbegin(), end = m_overlappingButtons.cend(); it != end; ++it) {
-+        QAbstractButton *sender = it.value();
-         connect(sender, SIGNAL(clicked()), overlappingMapper, SLOT(map()));
--        overlappingMapper->setMapping(sender, alignment);
-+        overlappingMapper->setMapping(sender, it.key());
-     }
-     connect(overlappingMapper, SIGNAL(mapped(int)), SLOT(emitOverlappingPositionChange(int)));
-     connect(m_posterAbsoluteWidthInput,             SIGNAL(valueEdited(qreal)),        SIGNAL(posterWidthAbsoluteChanged(qreal)));
-@@ -419,11 +412,11 @@ void Wizard::createConnections()
-     connect(m_posterPagesWidthInput,                SIGNAL(valueEdited(qreal)),        SIGNAL(posterWidthPagesChanged(qreal)));
-     connect(m_posterPagesHeightInput,               SIGNAL(valueEdited(qreal)),        SIGNAL(posterHeightPagesChanged(qreal)));
-     connect(m_posterPercentualSizeInput,            SIGNAL(valueEdited(qreal)),        SIGNAL(posterSizePercentualChanged(qreal)));
--    QSignalMapper *alignmentMapper = new QSignalMapper(this);
--    foreach (const Qt::Alignment alignment, m_alignmentButtons.keys()) {
--        QAbstractButton *sender = m_alignmentButtons.value(alignment);
-+    auto alignmentMapper = new QSignalMapper(this);
-+    for (auto it = m_alignmentButtons.cbegin(), end = m_alignmentButtons.cend(); it != end; ++it) {
-+        QAbstractButton *sender = it.value();
-         connect(sender, SIGNAL(clicked()), alignmentMapper, SLOT(map()));
--        alignmentMapper->setMapping(sender, alignment);
-+        alignmentMapper->setMapping(sender, it.key());
-     }
-     connect(alignmentMapper, SIGNAL(mapped(int)),   SLOT(emitPosterAlignmentChange(int)));
-     connect(m_savePosterButton,                     SIGNAL(clicked()),                  SIGNAL(savePosterSignal()));
-diff --git a/src/wizard.h b/src/wizard.h
-index b64927d..f6da58b 100644
---- a/src/wizard.h
-+++ b/src/wizard.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,7 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef WIZARD_H
--#define WIZARD_H
-+#pragma once
- 
- #include "ui_wizard.h"
- #include "types.h"
-@@ -31,9 +30,9 @@ class Wizard : public QWidget, private Ui::Wizard
-     Q_OBJECT
- 
- public:
--    Wizard(QWidget *parent = 0);
-+    Wizard(QWidget *parent = nullptr);
- 
--    void changeEvent(QEvent *event);
-+    void changeEvent(QEvent *event) override;
- 
- public slots:
-     void retranslateUi();
-@@ -117,5 +116,3 @@ private slots:
-     void emitPosterAlignmentChange(int alignmentInt) const;
-     void updatePosterSizeGroupsState();
- };
--
--#endif // WIZARD_H
-diff --git a/src/wizardcontroller.cpp b/src/wizardcontroller.cpp
-index e429ff9..99aa0db 100644
---- a/src/wizardcontroller.cpp
-+++ b/src/wizardcontroller.cpp
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,11 +20,12 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#include "wizardcontroller.h"
- #include "types.h"
-+#include "wizardcontroller.h"
-+
- #include <QCoreApplication>
--#include <QMetaObject>
- #include <QMetaEnum>
-+#include <QMetaObject>
- 
- static const QMetaEnum wizardStepsEnum()
- {
-@@ -39,8 +40,6 @@ static int wizardStepsCount()
- 
- WizardController::WizardController(QObject *wizardDialog, QObject *parent)
-     : QObject(parent)
--    , m_wizardStep(WizardStepInputImage)
--    , m_imageWasLoaded(false)
- {
-     connect(this, SIGNAL(wizardStepChanged(int)), wizardDialog, SLOT(setWizardStep(int)));
-     connect(this, SIGNAL(wizardStepDescriptionChanged(const QString&, const QString&)), wizardDialog, SLOT(setWizardStepDescription(const QString&, const QString&)));
-@@ -75,7 +74,7 @@ void WizardController::setStepAvailable(WizardSteps step, bool available)
- WizardController::WizardSteps WizardController::previousAvailableStep()
- {
-     for (int i = m_wizardStep; i > WizardStepInputImage; i--){
--        const WizardSteps newStep = WizardSteps(i - 1);
-+        const auto newStep = WizardSteps(i - 1);
-         if (!m_unavaliableSteps.contains(newStep))
-             return newStep;
-     }
-@@ -86,7 +85,7 @@ WizardController::WizardSteps WizardController::previousAvailableStep()
- WizardController::WizardSteps WizardController::nextAvailableStep()
- {
-     for (int i = m_wizardStep; i < WizardStepSavePoster; ++i){
--        const WizardSteps newStep = WizardSteps(i + 1);
-+        const auto newStep = WizardSteps(i + 1);
-         if (!m_unavaliableSteps.contains(newStep))
-             return newStep;
-     }
-@@ -110,8 +109,8 @@ void WizardController::showManual()
-         "All entries and choices are remembered until the next usage of the PosteRazor.",
-         "Manual preface. Place holders: %1 = Number of wizard steps, %2 = 'Back', %3 = 'Next' (will be automatically inserted)")
-         .arg(wizardStepsCount() - m_unavaliableSteps.count())
--        .arg(QCoreApplication::translate("Main window", "Back"))
--        .arg(QCoreApplication::translate("Main window", "Next"))));
-+        .arg(QCoreApplication::translate("Main window", "Back"),
-+             QCoreApplication::translate("Main window", "Next"))));
-     for (int i = 0; i < wizardStepsEnum().keyCount(); i++) {
-         const WizardSteps step = (WizardSteps)wizardStepsEnum().value(i);
-         if (!m_unavaliableSteps.contains(step)){
-@@ -148,8 +147,7 @@ void WizardController::updateDialogWizardStep()
-         m_wizardStep == WizardStepInputImage ?  "image"
-         : m_wizardStep == WizardStepOverlapping ? "overlapping"
-         : m_wizardStep == WizardStepPaperSize ? "paper"
--        : m_wizardStep == WizardStepPosterSize ? "poster"
--        : "poster"
-+        : "poster" // WizardStepPosterSize, WizardStepSavePoster
-     ));
-     emit prevButtonEnabled(m_wizardStep != previousAvailableStep());
-     emit nextButtonEnabled(
-@@ -204,9 +202,9 @@ QString WizardController::stepHelp(WizardSteps step)
-             "Alternatively, a custom paper sheet size can be defined in the <b>%2</b> tab.\n"
-             "Paper borders are defined in the <b>%3</b> fields. Even if your printer does need no (or small) paper borders, some border might be needed to have enough area for gluing the final poster tiles together.",
-             "Wizard step 2. Place holders: %1 = 'Format:', %2 = 'Custom', %3 = 'Borders' (will be automatically inserted)")
--            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Format:")))
--            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Custom")))
--            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Borders")));
-+            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Format:")),
-+                 Types::cleanString(QCoreApplication::translate("Main window", "Custom")),
-+                 Types::cleanString(QCoreApplication::translate("Main window", "Borders")));
-         break;
-     case WizardStepOverlapping:
-         result = QCoreApplication::translate("Help",
-@@ -223,20 +221,20 @@ QString WizardController::stepHelp(WizardSteps step)
-             "Wizard step 4. Start of the description.");
-         result.append(QLatin1String("<dl>"));
-         result.append(definitionTemplate
--            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Absolute size:")))
--            .arg(QCoreApplication::translate("Help",
--                "You want to have a specific size of your poster.",
--                "Wizard step 4. Description for 'absolute size'")));
-+                      .arg(Types::cleanString(QCoreApplication::translate("Main window", "Absolute size:")),
-+                           QCoreApplication::translate("Help",
-+                                                       "You want to have a specific size of your poster.",
-+                                                       "Wizard step 4. Description for 'absolute size'")));
-         result.append(definitionTemplate
--            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Size in pages:")))
--            .arg(QCoreApplication::translate("Help",
--                "You want to use whole paper sheets and specify how many of them you want to use.",
--                "Wizard step 4. Description for 'size in pages'")));
-+                      .arg(Types::cleanString(QCoreApplication::translate("Main window", "Size in pages:")),
-+                           QCoreApplication::translate("Help",
-+                                                       "You want to use whole paper sheets and specify how many of them you want to use.",
-+                                                       "Wizard step 4. Description for 'size in pages'")));
-         result.append(definitionTemplate
--            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Size in percent:")))
--            .arg(QCoreApplication::translate("Help",
--                "Your input image has a certain size which is defined by the number of pixels and dpi (dots per Inch) and your want to enlarge the image by a certain factor.",
--                "Wizard step 4. Description for 'size in percent'")));
-+                      .arg(Types::cleanString(QCoreApplication::translate("Main window", "Size in percent:")),
-+                           QCoreApplication::translate("Help",
-+                                                       "Your input image has a certain size which is defined by the number of pixels and dpi (dots per Inch) and your want to enlarge the image by a certain factor.",
-+                                                       "Wizard step 4. Description for 'size in percent'")));
-         result.append(QLatin1String("</dl>"));
-         result.append(QCoreApplication::translate("Help",
-             "The aspect ratio of width and height is always 1:1 and is automatically recalculated. In the preview area, you can see the overlapping areas which are surrounded by light red rectangles.\n"
-diff --git a/src/wizardcontroller.h b/src/wizardcontroller.h
-index 8cf61c0..31c6ef7 100644
---- a/src/wizardcontroller.h
-+++ b/src/wizardcontroller.h
-@@ -1,6 +1,6 @@
- /*
-     PosteRazor - Make your own poster!
--    Copyright (C) 2005-2009 by Alessandro Portale
-+    Copyright (C) 2005-2018 by Alessandro Portale
-     http://posterazor.sourceforge.net/
- 
-     This file is part of PosteRazor
-@@ -20,8 +20,7 @@
-     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
- 
--#ifndef WIZARDCONTROLLER_H
--#define WIZARDCONTROLLER_H
-+#pragma once
- 
- #include <QObject>
- 
-@@ -39,7 +38,7 @@ public:
-         WizardStepSavePoster
-     };
- 
--    WizardController(QObject *wizardDialog, QObject *parent = 0);
-+    WizardController(QObject *wizardDialog, QObject *parent = nullptr);
- 
-     void setStepAvailable(WizardSteps step, bool available);
-     WizardSteps previousAvailableStep();
-@@ -66,13 +65,11 @@ signals:
-     void showWizardStepHelpSignal(const QString &title, const QString &manual) const;
- 
- private:
--    WizardSteps m_wizardStep;
--    bool m_imageWasLoaded;
-+    WizardSteps m_wizardStep = WizardStepInputImage;
-+    bool m_imageWasLoaded = false;
-     QList<WizardSteps> m_unavaliableSteps;
- 
-     QString stepXofYString(WizardSteps step) const;
-     static QString stepTitle(WizardSteps step);
-     static QString stepHelp(WizardSteps step);
- };
--
--#endif // WIZARDCONTROLLER_H

Copied: posterazor/repos/community-x86_64/update.patch (from rev 1189793, posterazor/trunk/update.patch)
===================================================================
--- update.patch	                        (rev 0)
+++ update.patch	2022-04-25 02:00:17 UTC (rev 1189794)
@@ -0,0 +1,2104 @@
+diff --git a/src/controller.cpp b/src/controller.cpp
+index b332d9a..f0307fb 100644
+--- a/src/controller.cpp
++++ b/src/controller.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -23,15 +23,22 @@
+ #include "controller.h"
+ #include "posterazorcore.h"
+ #include "wizardcontroller.h"
++
+ #include <QAction>
+ #include <QCoreApplication>
+-#include <QLocale>
+-#include <QSettings>
++#include <QDesktopServices>
+ #include <QFileDialog>
++#include <QLocale>
+ #include <QMessageBox>
+-#include <QUrl>
+-#include <QDesktopServices>
++#include <QSettings>
+ #include <QTranslator>
++#include <QUrl>
++
++#ifdef Q_OS_WASM
++#include <emscripten.h>
++#include <emscripten/html5.h>
++#include <QBuffer>
++#endif // Q_OS_WASM
+ 
+ const QLatin1String settingsKey_LaunchPDFApplication("LaunchPDFApplication");
+ const QLatin1String settingsKey_TranslationName("TranslationName");
+@@ -42,7 +49,6 @@ Controller::Controller(PosteRazorCore *posteRazorCore, QWidget *view, QObject *p
+     : QObject(parent)
+     , m_posteRazorCore(posteRazorCore)
+     , m_view(view)
+-    , m_launchPDFApplication(true)
+ {
+     connect(m_view, SIGNAL(paperFormatChanged(const QString&)), SLOT(setPaperFormat(const QString&)));
+     connect(m_view, SIGNAL(paperOrientationChanged(QPrinter::Orientation)), SLOT(setPaperOrientation(QPrinter::Orientation)));
+@@ -110,21 +116,19 @@ Controller::Controller(PosteRazorCore *posteRazorCore, QWidget *view, QObject *p
+         {SIGNAL(setPosterSizeModeAvailableSignal(Types::PosterSizeModes, bool)),
+                                                                     SLOT(setPosterSizeModeAvailable(Types::PosterSizeModes, bool))}
+     };
+-    static const int signalsToViewSlotsConnectionsCount =
+-        int(sizeof signalsToViewSlotsConnections / sizeof signalsToViewSlotsConnections[0]);
+-    for (int i = 0; i < signalsToViewSlotsConnectionsCount; ++i) {
++    for (auto &connection : signalsToViewSlotsConnections) {
+         const QByteArray slot(
+-                QMetaObject::normalizedSignature(signalsToViewSlotsConnections[i].slot + 1));
++                QMetaObject::normalizedSignature(connection.slot + 1));
+                 // + 1: Remove slot flag '1'
+         if (m_view->metaObject()->indexOfSlot(slot) != -1)
+-            connect(this, signalsToViewSlotsConnections[i].signal, m_view, signalsToViewSlotsConnections[i].slot);
++            connect(this, connection.signal, m_view, connection.slot);
+     }
+ 
+     m_wizardController = new WizardController(m_view, this);
+ 
+     if (!m_posteRazorCore->imageIOLibraryAboutText().isEmpty()) {
+-        QAction *aboutAction = new QAction(m_view);
+-        aboutAction->setText(QLatin1String("A&bout ") + m_posteRazorCore->imageIOLibraryName());
++        auto aboutAction = new QAction(m_view);
++        aboutAction->setText(QStringLiteral("A&bout ") + m_posteRazorCore->imageIOLibraryName());
+         connect (aboutAction, SIGNAL(triggered()), SLOT(showExtraAboutDialog()));
+         emit addAboutDialogActionSignal(aboutAction);
+     }
+@@ -413,7 +417,7 @@ void Controller::loadInputImage()
+     for (int i = 0; i < formats.count(); i++) {
+         QStringList formatWildcards;
+         foreach (const QString &extension, formats.at(i).first)
+-            formatWildcards << QLatin1String("*.") + extension;
++            formatWildcards << QStringLiteral("*.") + extension;
+         allWildcards << formatWildcards;
+         QString formatName = formats.at(i).second;
+         // Some Open File dialogs (at least OSX) ar irritated if there are brackes in the file type name
+@@ -425,27 +429,34 @@ void Controller::loadInputImage()
+ 
+     QSettings loadPathSettings;
+ 
+-    QString loadFileName = QFileDialog::getOpenFileName (
+-        m_view,
+-        QCoreApplication::translate("Main window", "Load an input image"),
+-        loadPathSettings.value(settingsKey_ImageLoadPath,
+-#if QT_VERSION >= 0x050000
+-            QStandardPaths::standardLocations(QStandardPaths::PicturesLocation).first()
+-#elif QT_VERSION >= 0x040400
+-            QDesktopServices::storageLocation(QDesktopServices::PicturesLocation)
++    const QString loadPathDefault =
++            QStandardPaths::standardLocations(QStandardPaths::PicturesLocation).constFirst();
++#ifdef Q_OS_WASM
++    QFileDialog::getOpenFileContent(allFilters.join(QLatin1String(";;")),
++                                    [this](const QString &fileName, const QByteArray &fileContent) {
++        const QString previousFileName = m_posteRazorCore->fileName();
++        const QString copyFileName = QLatin1String("/home/web_user/") + QFileInfo(fileName).fileName();
++
++        QFile imageFile(copyFileName);
++        if (imageFile.open(QIODevice::WriteOnly)) {
++            imageFile.write(fileContent);
++            imageFile.close();
++        }
++
++        if (handleInputImageSelected(copyFileName))
++            QFile::remove(previousFileName);
++        else
++            QFile::remove(copyFileName);
++    });
+ #else
+-            QLatin1String(".")
+-#endif
+-            ).toString(),
+-        allFilters.join(QLatin1String(";;"))
+-    );
++    const QString loadFileName =
++            QFileDialog::getOpenFileName(m_view,
++                                         QCoreApplication::translate("Main window", "Load an input image"),
++                                         loadPathSettings.value(settingsKey_ImageLoadPath, loadPathDefault).toString(),
++                                         allFilters.join(QLatin1String(";;")));
+ 
+-    if (!loadFileName.isEmpty()) {
+-        const bool successful = loadInputImage(loadFileName);
+-        if (successful)
+-            loadPathSettings.setValue(settingsKey_ImageLoadPath,
+-                QDir::toNativeSeparators(QFileInfo(loadFileName).absolutePath()));
+-    }
++    handleInputImageSelected(loadFileName);
++#endif // QT_OS_WASM
+ }
+ 
+ bool Controller::loadInputImage(const QString &fileName)
+@@ -471,29 +482,64 @@ bool Controller::loadInputImage(const QString &imageFileName, QString &errorMess
+ 
+ int Controller::savePoster(const QString &fileName) const
+ {
+-    const int result = m_posteRazorCore->savePoster(fileName);
++#ifdef Q_OS_WASM
++    QByteArray posterData;
++    QBuffer outIODevice(&posterData);
++    outIODevice.open(QIODevice::WriteOnly);
++#else
++    QFile outIODevice(fileName);
++    if (!outIODevice.open((QIODevice::WriteOnly)))
++        return -1;
++#endif // Q_OS_WASM
++
++    const int result = m_posteRazorCore->savePoster(&outIODevice);
++
++#ifdef Q_OS_WASM
++    outIODevice.close();
++    // Snippet borrowed from my dear colleague Morten:
++    // https://codereview.qt-project.org/c/qt/qtbase/+/228599
++    EM_ASM_({
++        // Make the file contents and file name hint accessible to Javascript: convert
++        // the char * to a JavaScript string and create a subarray view into the C heap.
++        const contentPointer = $0;
++        const contentLength = $1;
++        const fileNameHint = UTF8ToString($2);
++        const fileContent = Module.HEAPU8.subarray(contentPointer, contentPointer + contentLength);
++
++        // Create a hidden download link and click it programatically
++        const fileblob = new Blob([fileContent], { type : "application/octet-stream" } );
++        var link = document.createElement("a");
++        document.body.appendChild(link);
++        link.download = fileNameHint;
++        link.href = window.URL.createObjectURL(fileblob);
++        link.style = "display:none";
++        link.click();
++        document.body.removeChild(link);
++    }, posterData.constData(), posterData.length(), fileName.toUtf8().constData());
++#else
+     if (result == 0 && m_launchPDFApplication)
+         QDesktopServices::openUrl(QUrl::fromLocalFile(fileName));
++#endif // Q_OS_WASM
++
+     return result;
+ }
+ 
+ void Controller::savePoster() const
+ {
++#ifdef Q_OS_WASM
++    savePoster(QFileInfo(m_posteRazorCore->fileName()).baseName() + QLatin1String(".pdf"));
++    return;
++#endif // Q_OS_WASM
++
+     QSettings savePathSettings;
+ 
+     QString saveFileName = savePathSettings.value(settingsKey_PosterSavePath,
+-#if QT_VERSION >= 0x050000
+-        QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)
+-#elif QT_VERSION >= 0x040400
+-        QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation)
+-#else
+-        "."
+-#endif
+-        ).toString() + QDir::separator()
+-                     + QFileInfo(m_posteRazorCore->fileName()).baseName()
+-                     + QLatin1String("-")
+-                     + QCoreApplication::translate("Main window", "poster")
+-                     + QLatin1String(".pdf");
++        QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)).toString()
++            + QDir::separator()
++            + QFileInfo(m_posteRazorCore->fileName()).baseName()
++            + QLatin1String("-")
++            + QCoreApplication::translate("Main window", "poster")
++            + QLatin1String(".pdf");
+     bool fileExistsAskUserForOverwrite = false;
+ 
+     do {
+@@ -502,7 +548,7 @@ void Controller::savePoster() const
+             QCoreApplication::translate("Main window", "Save the poster"),
+             saveFileName,
+             QLatin1String("Portable Document format (*.pdf)"),
+-            NULL,
++            nullptr,
+             QFileDialog::DontConfirmOverwrite
+         );
+ 
+@@ -511,7 +557,7 @@ void Controller::savePoster() const
+             if (saveFileInfo.suffix().toLower() != QLatin1String("pdf"))
+                 saveFileName.append(QLatin1String(".pdf"));
+ 
+-            fileExistsAskUserForOverwrite = QFileInfo(saveFileName).exists();
++            fileExistsAskUserForOverwrite = QFileInfo::exists(saveFileName);
+ 
+             if (!fileExistsAskUserForOverwrite
+                     || QMessageBox::Yes == (QMessageBox::question(m_view, QString(), QCoreApplication::translate("Main window", "The file '%1' already exists.\nDo you want to overwrite it?").arg(saveFileInfo.fileName()), QMessageBox::Yes, QMessageBox::No))
+@@ -564,10 +610,8 @@ void Controller::showExtraAboutDialog()
+ {
+     const QString title = QLatin1String("About ") + m_posteRazorCore->imageIOLibraryName();
+     QMessageBox::about(
+-        m_view, title,
+-        QString::fromLatin1("<h3>%1</h3>%2") // QMessageBox::aboutQt() also uses <h3>
+-            .arg(title)
+-            .arg(Types::newlineToParagraph(m_posteRazorCore->imageIOLibraryAboutText()))
++        m_view, title, QStringLiteral("<h3>%1</h3>%2")
++                .arg(title, Types::newlineToParagraph(m_posteRazorCore->imageIOLibraryAboutText()))
+     );
+ }
+ 
+@@ -582,3 +626,19 @@ void Controller::imageSuffixSupported(const QString &suffix, bool &outIsSupporte
+         }
+     }
+ }
++
++bool Controller::handleInputImageSelected(const QString &fileName)
++{
++    bool successful = false;
++
++    if (!fileName.isEmpty()) {
++        successful = loadInputImage(fileName);
++        if (successful) {
++            QSettings loadPathSettings;
++            loadPathSettings.setValue(settingsKey_ImageLoadPath,
++                QDir::toNativeSeparators(QFileInfo(fileName).absolutePath()));
++        }
++    }
++
++    return successful;
++}
+diff --git a/src/controller.h b/src/controller.h
+index 73c6059..3c436be 100644
+--- a/src/controller.h
++++ b/src/controller.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,7 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef CONTROLLER_H
+-#define CONTROLLER_H
++#pragma once
+ 
+ #include "types.h"
+ #include <QObject>
+@@ -40,7 +39,7 @@ class Controller: public QObject
+     Q_OBJECT
+ 
+ public:
+-    Controller(PosteRazorCore *posteRazorCore, QWidget *view, QObject *parent = 0);
++    Controller(PosteRazorCore *posteRazorCore, QWidget *view, QObject *parent = nullptr);
+ 
+     void updateDialog();
+     void updatePreview();
+@@ -123,11 +122,11 @@ private slots:
+     void imageSuffixSupported(const QString &suffix, bool &outIsSupported) const;
+ 
+ protected:
+-    PosteRazorCore *m_posteRazorCore;
+-    QWidget *m_view;
+-    bool m_launchPDFApplication;
+-    WizardController *m_wizardController;
+-    QTranslator *m_translator;
++    PosteRazorCore *m_posteRazorCore = nullptr;
++    QWidget *m_view = nullptr;
++    bool m_launchPDFApplication = true;
++    WizardController *m_wizardController = nullptr;
++    QTranslator *m_translator = nullptr;
+     QString m_translationName;
+ 
+     void setDialogSaveOptions();
+@@ -140,6 +139,5 @@ protected:
+     void setDialogImageInfoFields();
+     void setDialogOverlappingDimensions();
+     void setDialogOverlappingOptions();
++    bool handleInputImageSelected(const QString &fileName);
+ };
+-
+-#endif // CONTROLLER_H
+diff --git a/src/imageloaderfreeimage.cpp b/src/imageloaderfreeimage.cpp
+index 44d6699..157fb6d 100644
+--- a/src/imageloaderfreeimage.cpp
++++ b/src/imageloaderfreeimage.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -22,10 +22,12 @@
+ 
+ #include "FreeImage.h"
+ #include "imageloaderfreeimage.h"
+-#include <qendian.h>
+-#include <QStringList>
++
+ #include <QColor>
+-#include <math.h>
++#include <QStringList>
++#include <qendian.h>
++
++#include <cmath>
+ 
+ static QString FreeImageErrorMessage;
+ 
+@@ -52,11 +54,6 @@ public:
+ 
+ ImageLoaderFreeImage::ImageLoaderFreeImage(QObject *parent)
+     : QObject(parent)
+-    , m_bitmap(NULL)
+-    , m_widthPixels(0)
+-    , m_heightPixels(0)
+-    , m_horizontalDotsPerMeter(0)
+-    , m_verticalDotsPerMeter(0)
+ {
+     const static FreeImageInitializer initializer;
+ }
+@@ -70,7 +67,7 @@ void ImageLoaderFreeImage::disposeImage()
+ {
+     if (m_bitmap) {
+         FreeImage_Unload(m_bitmap);
+-        m_bitmap = NULL;
++        m_bitmap = nullptr;
+     }
+ }
+ 
+@@ -92,7 +89,7 @@ bool ImageLoaderFreeImage::loadInputImage(const QString &imageFileName, QString
+             && type != FIT_RGB16 // 16bpp Greyscale, 48bpp Rgb
+             ) {
+             FreeImage_Unload(newImage);
+-            newImage = NULL;
++            newImage = nullptr;
+         }
+     }
+ 
+@@ -131,7 +128,7 @@ bool ImageLoaderFreeImage::loadInputImage(const QString &imageFileName, QString
+ 
+ bool ImageLoaderFreeImage::isImageLoaded() const
+ {
+-    return (m_bitmap != NULL);
++    return (m_bitmap != nullptr);
+ }
+ 
+ bool ImageLoaderFreeImage::isJpeg() const
+@@ -177,8 +174,8 @@ const QImage ImageLoaderFreeImage::imageAsRGB(const QSize &size) const
+     const QSize sizePixels = this->sizePixels();
+ 
+     FIBITMAP* originalImage = m_bitmap;
+-    FIBITMAP* temp24BPPImage = NULL;
+-    FIBITMAP* scaledImage = NULL;
++    FIBITMAP* temp24BPPImage = nullptr;
++    FIBITMAP* scaledImage = nullptr;
+ 
+     if (!(isRGB24 || isARGB32)) {
+         if (colorDataType() == Types::ColorTypeCMYK) {
+@@ -272,7 +269,7 @@ const QByteArray ImageLoaderFreeImage::bits() const
+     char *destination = result.data();
+     FreeImage_ConvertToRawBits((BYTE*)destination, m_bitmap, bytesPerLine, bitsPerPixel(), FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, hasFreeImageVersionCorrectTopDownInConvertBits());
+ 
+-    const unsigned long numberOfPixels = m_widthPixels * m_heightPixels;
++    const unsigned int numberOfPixels = m_widthPixels * m_heightPixels;
+ #if FREEIMAGE_COLORORDER == FREEIMAGE_COLORORDER_BGR
+     if (colorDataType() == Types::ColorTypeRGB && bitsPerPixel() == 24) {
+         for (unsigned int pixelIndex = 0; pixelIndex < numberOfPixels; pixelIndex++) {
+@@ -283,7 +280,7 @@ const QByteArray ImageLoaderFreeImage::bits() const
+             pixelPtr+=3;
+         }
+     } else if (colorDataType() == Types::ColorTypeRGBA && bitsPerPixel() == 32) {
+-        unsigned int* argbDestination = (unsigned int*)destination;
++        auto argbDestination = (unsigned int*)destination;
+         for (unsigned int pixelIndex = 0; pixelIndex < numberOfPixels; pixelIndex++) {
+             *argbDestination = qToBigEndian(*argbDestination);
+             argbDestination++;
+@@ -293,7 +290,7 @@ const QByteArray ImageLoaderFreeImage::bits() const
+     if (colorDataType() == Types::ColorTypeRGB && bitsPerPixel() == 48) {
+         // Apparently, the 48 bit data has to be reordered on Windows and ppc/i386 OSX
+         // TODO: So maybe this swap belongs into the PDFwriter. Investigate.
+-        unsigned short* rgb48Destination = (unsigned short*)destination;
++        auto rgb48Destination = (unsigned short*)destination;
+         const unsigned long numberOfSwaps = numberOfPixels * 3; // Words are swapped
+         for (unsigned int pixelIndex = 0; pixelIndex < numberOfSwaps; pixelIndex++) {
+             *rgb48Destination = qToBigEndian(*rgb48Destination);
+diff --git a/src/imageloaderfreeimage.h b/src/imageloaderfreeimage.h
+index bf705c7..647f79b 100644
+--- a/src/imageloaderfreeimage.h
++++ b/src/imageloaderfreeimage.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,7 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef IMAGELOADERFREEIMAGE_H
+-#define IMAGELOADERFREEIMAGE_H
++#pragma once
+ 
+ #include "imageloaderinterface.h"
+ 
+@@ -30,36 +29,34 @@ struct FIBITMAP;
+ class ImageLoaderFreeImage: public QObject, public ImageLoaderInterface
+ {
+ public:
+-    ImageLoaderFreeImage(QObject *parent = 0);
+-    ~ImageLoaderFreeImage();
+-
+-    bool loadInputImage(const QString &imageFileName, QString &errorMessage);
+-    bool isImageLoaded() const;
+-    bool isJpeg() const;
+-    QString fileName() const;
+-    QSize sizePixels() const;
+-    qreal horizontalDotsPerUnitOfLength(Types::UnitsOfLength unit) const;
+-    qreal verticalDotsPerUnitOfLength(Types::UnitsOfLength unit) const;
+-    QSizeF size(Types::UnitsOfLength unit) const;
+-    const QImage imageAsRGB(const QSize &size) const;
+-    int bitsPerPixel() const;
+-    Types::ColorTypes colorDataType() const;
+-    const QByteArray bits() const;
+-    const QVector<QRgb> colorTable() const;
+-    const QVector<QPair<QStringList, QString> > &imageFormats() const;
+-    QString libraryName() const;
+-    QString libraryAboutText() const;
++    ImageLoaderFreeImage(QObject *parent = nullptr);
++    ~ImageLoaderFreeImage() override;
++
++    bool loadInputImage(const QString &imageFileName, QString &errorMessage) override;
++    bool isImageLoaded() const override;
++    bool isJpeg() const override;
++    QString fileName() const override;
++    QSize sizePixels() const override;
++    qreal horizontalDotsPerUnitOfLength(Types::UnitsOfLength unit) const override;
++    qreal verticalDotsPerUnitOfLength(Types::UnitsOfLength unit) const override;
++    QSizeF size(Types::UnitsOfLength unit) const override;
++    const QImage imageAsRGB(const QSize &size) const override;
++    int bitsPerPixel() const override;
++    Types::ColorTypes colorDataType() const override;
++    const QByteArray bits() const override;
++    const QVector<QRgb> colorTable() const override;
++    const QVector<QPair<QStringList, QString> > &imageFormats() const override;
++    QString libraryName() const override;
++    QString libraryAboutText() const override;
+ 
+ private:
+-    FIBITMAP*    m_bitmap;
+-    int          m_widthPixels;
+-    int          m_heightPixels;
+-    unsigned int m_horizontalDotsPerMeter;
+-    unsigned int m_verticalDotsPerMeter;
+-    QString      m_imageFileName;
++    FIBITMAP* m_bitmap = nullptr;
++    int m_widthPixels = 0;
++    int m_heightPixels = 0;
++    unsigned int m_horizontalDotsPerMeter = 0;
++    unsigned int m_verticalDotsPerMeter = 0;
++    QString m_imageFileName;
+ 
+     void disposeImage();
+     static bool hasFreeImageVersionCorrectTopDownInConvertBits();
+ };
+-
+-#endif // IMAGELOADERFREEIMAGE_H
+diff --git a/src/imageloaderinterface.h b/src/imageloaderinterface.h
+index 18e7848..419aafb 100644
+--- a/src/imageloaderinterface.h
++++ b/src/imageloaderinterface.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,7 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef IMAGELOADERINTERFACE_H
+-#define IMAGELOADERINTERFACE_H
++#pragma once
+ 
+ #include "types.h"
+ #include <QImage>
+@@ -33,7 +32,7 @@ QT_END_NAMESPACE
+ class ImageLoaderInterface
+ {
+ public:
+-    virtual ~ImageLoaderInterface() {}
++    virtual ~ImageLoaderInterface() = default;
+ 
+     virtual bool loadInputImage(const QString &imageFileName, QString &errorMessage) = 0;
+     virtual bool isImageLoaded() const = 0;
+@@ -52,5 +51,3 @@ public:
+     virtual QString libraryName() const = 0;
+     virtual QString libraryAboutText() const = 0;
+ };
+-
+-#endif // IMAGELOADERINTERFACE_H
+diff --git a/src/imageloaderqt.cpp b/src/imageloaderqt.cpp
+index ec53caa..0f4c53f 100644
+--- a/src/imageloaderqt.cpp
++++ b/src/imageloaderqt.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -21,11 +21,12 @@
+ */
+ 
+ #include "imageloaderqt.h"
++
+ #include <QImageReader>
+ #ifdef POPPLER_QT5_LIB
+ #include <poppler-qt5.h>
+ #endif
+-#include <math.h>
++#include <cmath>
+ 
+ ImageLoaderQt::ImageLoaderQt(QObject *parent)
+     : QObject(parent)
+@@ -51,7 +52,7 @@ bool ImageLoaderQt::loadPdf(const QString &imageFileName, QString &errorMessage)
+ 
+     // FIXME: Allow user to select page (currrently hard-wired to first page).
+     Poppler::Page* pdfPage = document->page(0); // Document starts at page 0
+-    if (pdfPage == 0)
++    if (pdfPage == nullptr)
+       return false;
+ 
+     // FIXME: Don't hard-wire the resolution, and display correct resolution!
+@@ -114,7 +115,10 @@ qreal ImageLoaderQt::verticalDotsPerUnitOfLength(Types::UnitsOfLength unit) cons
+ QSizeF ImageLoaderQt::size(Types::UnitsOfLength unit) const
+ {
+     const QSize sizePixels = this->sizePixels();
+-    return QSizeF(sizePixels.width() / horizontalDotsPerUnitOfLength(unit), sizePixels.height() / verticalDotsPerUnitOfLength(unit));
++    return {
++        sizePixels.width() / horizontalDotsPerUnitOfLength(unit),
++        sizePixels.height() / verticalDotsPerUnitOfLength(unit)
++    };
+ }
+ 
+ const QImage ImageLoaderQt::imageAsRGB(const QSize &size) const
+@@ -212,17 +216,16 @@ const QVector<QPair<QStringList, QString> > &ImageLoaderQt::imageFormats() const
+             {QLatin1String("xbm"),      QLatin1String("X11 Bitmap")},
+             {QLatin1String("xpm"),      QLatin1String("X11 Pixmap")}
+         };
+-        const int extensionListCount = int(sizeof extensionList / sizeof extensionList[0]);
+         const QList<QByteArray> supportedFormats = QImageReader::supportedImageFormats();
+-        for (int i = 0; i < extensionListCount; i++) {
+-            QStringList extensions = extensionList[i].extensions.split(QLatin1Char(' '));
++        for (auto &format : extensionList) {
++            QStringList extensions = format.extensions.split(QLatin1Char(' '));
+             foreach (const QString &extension, extensions)
+                 if (supportedFormats.contains(extension.toLatin1())
+ #ifdef POPPLER_QT5_LIB
+                     || (extension.toLatin1() == "pdf")
+ #endif
+                     ) {
+-                    formats.append(QPair<QStringList, QString> (extensions, extensionList[i].description));
++                    formats.append({extensions, format.description});
+                     break;
+                 }
+         }
+diff --git a/src/imageloaderqt.h b/src/imageloaderqt.h
+index 2dbedab..c7a11a7 100644
+--- a/src/imageloaderqt.h
++++ b/src/imageloaderqt.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,7 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef IMAGELOADERQT_H
+-#define IMAGELOADERQT_H
++#pragma once
+ 
+ #include "imageloaderinterface.h"
+ #include <QObject>
+@@ -29,25 +28,25 @@
+ class ImageLoaderQt: public QObject, public ImageLoaderInterface
+ {
+ public:
+-    ImageLoaderQt(QObject *parent = 0);
+-
+-    bool loadInputImage(const QString &imageFileName, QString &errorMessage);
+-    bool isImageLoaded() const;
+-    bool isJpeg() const;
+-    QString fileName() const;
+-    QSize sizePixels() const;
+-    qreal horizontalDotsPerUnitOfLength(Types::UnitsOfLength unit) const;
+-    qreal verticalDotsPerUnitOfLength(Types::UnitsOfLength unit) const;
+-    QSizeF size(Types::UnitsOfLength unit) const;
+-    const QImage imageAsRGB(const QSize &size) const;
+-    int bitsPerPixel() const;
+-    Types::ColorTypes colorDataType() const;
++    ImageLoaderQt(QObject *parent = nullptr);
++
++    bool loadInputImage(const QString &imageFileName, QString &errorMessage) override;
++    bool isImageLoaded() const override;
++    bool isJpeg() const override;
++    QString fileName() const override;
++    QSize sizePixels() const override;
++    qreal horizontalDotsPerUnitOfLength(Types::UnitsOfLength unit) const override;
++    qreal verticalDotsPerUnitOfLength(Types::UnitsOfLength unit) const override;
++    QSizeF size(Types::UnitsOfLength unit) const override;
++    const QImage imageAsRGB(const QSize &size) const override;
++    int bitsPerPixel() const override;
++    Types::ColorTypes colorDataType() const override;
+     int savePoster(const QString &fileName, const PainterInterface *painter, int pagesCount, const QSizeF &sizeCm) const;
+-    const QByteArray bits() const;
+-    const QVector<QRgb> colorTable() const;
+-    const QVector<QPair<QStringList, QString> > &imageFormats() const;
+-    QString libraryName() const;
+-    QString libraryAboutText() const;
++    const QByteArray bits() const override;
++    const QVector<QRgb> colorTable() const override;
++    const QVector<QPair<QStringList, QString> > &imageFormats() const override;
++    QString libraryName() const override;
++    QString libraryAboutText() const override;
+ 
+     void setQImage(const QImage &image);
+ 
+@@ -59,5 +58,3 @@ private:
+     QImage m_image;
+     QString m_imageFileName;
+ };
+-
+-#endif // IMAGELOADERQT_H
+diff --git a/src/main.cpp b/src/main.cpp
+index f509461..fdafc5a 100644
+--- a/src/main.cpp
++++ b/src/main.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,8 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#include "mainwindow.h"
+ #include "controller.h"
++#include "mainwindow.h"
+ #include "posterazorcore.h"
+ #if defined (FREEIMAGE_LIB)
+ #   include "imageloaderfreeimage.h"
+@@ -31,12 +31,6 @@
+ 
+ #include <QtGui>
+ 
+-#if !defined(QT_SHARED) && !defined(QT_DLL) && !defined(FREEIMAGE_LIB)
+-Q_IMPORT_PLUGIN(qgif)
+-Q_IMPORT_PLUGIN(qjpeg)
+-Q_IMPORT_PLUGIN(qtiff)
+-#endif
+-
+ int main (int argc, char **argv)
+ {
+     QApplication a(argc, argv);
+@@ -73,9 +67,7 @@ int main (int argc, char **argv)
+ #else
+ 
+     QCoreApplication::setApplicationName(QLatin1String("PosteRazor"));
+-#if QT_VERSION >= 0x040400
+-    QCoreApplication::setApplicationVersion(QLatin1String("1.9.5"));
+-#endif
++    QCoreApplication::setApplicationVersion(QLatin1String("1.9.7"));
+     QCoreApplication::setOrganizationName(QLatin1String("CasaPortale"));
+     QCoreApplication::setOrganizationDomain(QLatin1String("de.casaportale"));
+ 
+@@ -106,6 +98,8 @@ int main (int argc, char **argv)
+     dialog.writeSettings(&settings);
+     controller.writeSettings(&settings);
+ 
++    qDebug() << "supportedImageFormats" << QImageWriter::supportedImageFormats();
++
+     return appReturn;
+ #endif
+ }
+diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
+index 818cdd0..66c60b2 100644
+--- a/src/mainwindow.cpp
++++ b/src/mainwindow.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -21,19 +21,20 @@
+ */
+ 
+ #include "mainwindow.h"
+-#include <QSignalMapper>
+-#include <QFileDialog>
+-#include <QTranslator>
+-#include <QtDebug>
+-#include <QVBoxLayout>
++
+ #include <QDialogButtonBox>
+-#include <QTextBrowser>
+-#include <QMessageBox>
+-#include <QSettings>
+-#include <QMetaMethod>
+ #include <QDragEnterEvent>
+ #include <QDropEvent>
++#include <QFileDialog>
++#include <QMessageBox>
++#include <QMetaMethod>
+ #include <QMimeData>
++#include <QSettings>
++#include <QSignalMapper>
++#include <QTextBrowser>
++#include <QTranslator>
++#include <QVBoxLayout>
++#include <QtDebug>
+ 
+ const QLatin1String settingsKey_MainWindowGeometry("MainWindowGeometry");
+ 
+@@ -41,10 +42,7 @@ static QString applicationNameWithVersion()
+ {
+     return
+         QCoreApplication::applicationName()
+-#if QT_VERSION >= 0x040400
+-        + QLatin1Char(' ') + QCoreApplication::applicationVersion()
+-#endif
+-    ;
++        + QLatin1Char(' ') + QCoreApplication::applicationVersion() ;
+ }
+ 
+ MainWindow::MainWindow(QWidget *parent)
+@@ -84,7 +82,7 @@ void MainWindow::dragEnterEvent(QDragEnterEvent *event)
+ {
+     const QMimeData *mimeData = event->mimeData();
+     if (mimeData->hasUrls()) {
+-        const QUrl url = mimeData->urls().first();
++        const QUrl url = mimeData->urls().constFirst();
+         const QString localFile = url.toLocalFile();
+         const QString fileSuffix = QFileInfo(localFile).suffix();
+         bool suffixIsSupported = false;
+@@ -225,8 +223,7 @@ void MainWindow::updateImageInfoFields(const QSize &inputImageSizeInPixels, cons
+ 
+ void MainWindow::setCurrentTranslation(const QString &translation)
+ {
+-    QAction *translationAction = NULL;
+-    translationAction = m_translationActions.value(translation);
++    QAction *translationAction = m_translationActions.value(translation);
+     if (!translationAction) {
+         // On a Swiss system 'translation' may be "de_CH". So let's fall back to "de"
+         const QString translationLanguage = translation.split(QLatin1Char('_')).first();
+@@ -314,7 +311,7 @@ void MainWindow::showManual(const QString &title, const QString &text)
+     dialog->setWindowFlags(dialog->windowFlags() ^ Qt::WindowContextHelpButtonHint);
+     dialog->resize(500, 400);
+     dialog->setLayout(new QVBoxLayout);
+-    QTextBrowser *browser = new QTextBrowser;
++    auto browser = new QTextBrowser;
+     browser->setOpenExternalLinks(true);
+     browser->document()->setDefaultStyleSheet(QLatin1String(
+         "dt {font-weight: bold;}"
+@@ -324,7 +321,7 @@ void MainWindow::showManual(const QString &title, const QString &text)
+         "h2 {margin-top: 18px; margin-bottom: 6px;}"));
+     browser->setHtml(text);
+     dialog->layout()->addWidget(browser);
+-    QDialogButtonBox *buttonBox = new QDialogButtonBox;
++    auto buttonBox = new QDialogButtonBox;
+     buttonBox->setStandardButtons(QDialogButtonBox::Ok);
+     connect(buttonBox, SIGNAL(accepted ()), dialog, SLOT(accept()));
+     dialog->layout()->addWidget(buttonBox);
+@@ -380,9 +377,8 @@ void MainWindow::createConnections()
+         SIGNAL(needsPaint(PaintCanvasInterface*, const QVariant&)),
+         SIGNAL(imageLoaded()),
+     };
+-    static const int relayedSignalsCount = int(sizeof relayedSignals / sizeof relayedSignals[0]);
+-    for (int i = 0; i < relayedSignalsCount; ++i)
+-        connect(m_wizard, relayedSignals[i], relayedSignals[i]);
++    for (auto signal : relayedSignals)
++        connect(m_wizard, signal, signal);
+ }
+ 
+ void MainWindow::populateUI()
+@@ -399,7 +395,7 @@ void MainWindow::populateUI()
+ 
+     m_menuSettings->addSeparator();
+ 
+-    QActionGroup *translationActions = new QActionGroup(m_menuSettings);
++    auto translationActions = new QActionGroup(m_menuSettings);
+     connect (translationActions, SIGNAL(triggered(QAction*)), SLOT(handleTranslationAction(QAction*)));
+     translationActions->setExclusive(true);
+     const QDir translationDir(QLatin1String(":/Translations/"));
+@@ -463,7 +459,7 @@ void MainWindow::showAboutPosteRazorDialog()
+         QLatin1String("<h2>License</h2>"
+             "<p>PosteRazor - Make your own poster!<br/>"
+             "posterazor.sourceforge.net<br/>"
+-            "Copyright (C) 2005-2009 by Alessandro Portale</p>"
++            "Copyright (C) 2005-2018 by Alessandro Portale</p>"
+             "<p>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 the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p>"
+             "<p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p>"
+             "<p>You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p>");
+diff --git a/src/mainwindow.h b/src/mainwindow.h
+index e7bcf97..607ca0f 100644
+--- a/src/mainwindow.h
++++ b/src/mainwindow.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,7 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef MAINWINDOW_H
+-#define MAINWINDOW_H
++#pragma once
+ 
+ #include "ui_mainwindow.h"
+ 
+@@ -36,13 +35,13 @@ class MainWindow : public QMainWindow, private Ui::MainWindow
+     Q_OBJECT
+ 
+ public:
+-    MainWindow(QWidget *parent = 0);
++    MainWindow(QWidget *parent = nullptr);
+ 
+     void retranslateUi();
+     void retranslateUiWithDimensionUnit();
+-    void changeEvent(QEvent *event);
+-    void dragEnterEvent(QDragEnterEvent *event);
+-    void dropEvent(QDropEvent *event);
++    void changeEvent(QEvent *event) override;
++    void dragEnterEvent(QDragEnterEvent *event) override;
++    void dropEvent(QDropEvent *event) override;
+ 
+ public slots:
+     void setPaperFormat(const QString &format);
+@@ -83,9 +82,9 @@ public slots:
+     void showManual(const QString &title, const QString &text);
+ 
+ private:
+-    PosteRazorCore *m_posteRazor;
++    PosteRazorCore *m_posteRazor = nullptr;
+     QString m_currentUnitOfLength;
+-    QActionGroup *m_unitOfLengthActions;
++    QActionGroup *m_unitOfLengthActions = nullptr;
+     QHash<QString, QAction*> m_translationActions;
+ 
+     void createConnections();
+@@ -132,5 +131,3 @@ private slots:
+     void showAboutQtDialog() const;
+     void showAboutPosteRazorDialog();
+ };
+-
+-#endif // MAINWINDOW_H
+diff --git a/src/paintcanvas.cpp b/src/paintcanvas.cpp
+index 8a4bc0b..7d3abe2 100644
+--- a/src/paintcanvas.cpp
++++ b/src/paintcanvas.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -21,13 +21,13 @@
+ */
+ 
+ #include "paintcanvas.h"
++
+ #include <QImage>
+ #include <QPainter>
+ #include <QVariant>
+ 
+ PaintCanvas::PaintCanvas(QWidget *parent)
+     : QWidget(parent)
+-    , m_qPainter(NULL)
+     , m_state(QLatin1String("image"))
+ {
+ }
+@@ -39,7 +39,7 @@ void PaintCanvas::paintEvent(QPaintEvent *event)
+     m_qPainter = &painter;
+     m_qPainter->setRenderHint(QPainter::Antialiasing);
+     emit needsPaint(this, m_state);
+-    m_qPainter = NULL;
++    m_qPainter = nullptr;
+ }
+ 
+ void PaintCanvas::drawFilledRect(const QRectF &rect, const QBrush &brush)
+diff --git a/src/paintcanvas.h b/src/paintcanvas.h
+index a848c69..92ba3bc 100644
+--- a/src/paintcanvas.h
++++ b/src/paintcanvas.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,7 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef PAINTCANVAS_H
+-#define PAINTCANVAS_H
++#pragma once
+ 
+ #include <QWidget>
+ #include "paintcanvasinterface.h"
+@@ -37,18 +36,18 @@ class PaintCanvas: public QWidget, public PaintCanvasInterface
+ 
+ private:
+     QImage m_image;
+-    QPainter *m_qPainter;
++    QPainter *m_qPainter = nullptr;
+     QString m_state;
+ 
+ public:
+     PaintCanvas(QWidget *parent);
+ 
+-    void paintEvent(QPaintEvent *event);
+-    void drawFilledRect(const QRectF &rect, const QBrush &brush);
+-    QSizeF size() const;
+-    void drawImage(const QRectF &rect);
++    void paintEvent(QPaintEvent *event) override;
++    void drawFilledRect(const QRectF &rect, const QBrush &brush) override;
++    QSizeF size() const override;
++    void drawImage(const QRectF &rect) override;
+     void setState(const QString &state);
+-    void drawOverlayText(const QPointF &position, int flags, int size, const QString &text);
++    void drawOverlayText(const QPointF &position, int flags, int size, const QString &text) override;
+ 
+ public slots:
+     void setImage(const QImage &image);
+@@ -56,5 +55,3 @@ public slots:
+ signals:
+     void needsPaint(PaintCanvasInterface *paintDevice, const QVariant &options) const;
+ };
+-
+-#endif // PAINTCANVAS_H
+diff --git a/src/paintcanvasinterface.h b/src/paintcanvasinterface.h
+index c0c88c1..d625ecd 100644
+--- a/src/paintcanvasinterface.h
++++ b/src/paintcanvasinterface.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,7 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef PAINTCANVASINTERFACE_H
+-#define PAINTCANVASINTERFACE_H
++#pragma once
+ 
+ #include <QBrush>
+ #include <QSizeF>
+@@ -30,12 +29,10 @@
+ class PaintCanvasInterface
+ {
+ public:
+-    virtual ~PaintCanvasInterface() {}
++    virtual ~PaintCanvasInterface() = default;
+ 
+     virtual void drawFilledRect(const QRectF &rect, const QBrush &brush) = 0;
+     virtual QSizeF size() const = 0;
+     virtual void drawImage(const QRectF &rect) = 0;
+     virtual void drawOverlayText(const QPointF &position, int flags, int size, const QString &text) = 0;
+ };
+-
+-#endif // PAINTCANVASINTERFACE_H
+diff --git a/src/pdfwriter.cpp b/src/pdfwriter.cpp
+index 863517f..057e89e 100644
+--- a/src/pdfwriter.cpp
++++ b/src/pdfwriter.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -22,11 +22,13 @@
+ 
+ #include "paintcanvasinterface.h"
+ #include "pdfwriter.h"
+-#include <QRectF>
++
+ #include <QBrush>
++#include <QDateTime>
+ #include <QFile>
+ #include <QFileInfo>
+-#include <QDateTime>
++#include <QRectF>
++
+ #define LINEFEED "\x0A"
+ 
+ const int valuePrecision = 4;
+@@ -40,14 +42,6 @@ static qreal cm2Pt(qreal cm)
+ 
+ PDFWriter::PDFWriter(QObject *parent)
+     : QObject(parent)
+-    , m_outputFile(NULL)
+-    , m_pdfObjectCount(0)
+-    , m_objectPagesID(0)
+-    , m_firstPageID(5) // will be ++ed if the image has a SMask
+-    , m_objectResourcesID(0)
+-    , m_objectImageID(0)
+-    , m_mediaboxWidth(5000.0)
+-    , m_mediaboxHeight(5000.0)
+ {
+ }
+ 
+@@ -349,22 +343,17 @@ int PDFWriter::finishPage()
+     return err;
+ }
+ 
+-int PDFWriter::startSaving(const QString &fileName, int pages, qreal widthCm, qreal heightCm)
++int PDFWriter::startSaving(QIODevice *outputDevice, int pages, qreal widthCm, qreal heightCm)
+ {
+     int err = 0;
+ 
+     m_mediaboxWidth = cm2Pt(widthCm);
+     m_mediaboxHeight = cm2Pt(heightCm);
+ 
+-    if (m_outputFile) {
+-        m_outputFile->close();
+-        delete m_outputFile;
+-    }
+-    m_outputFile = new QFile(fileName, this);
+-    if (!m_outputFile->open(QIODevice::WriteOnly))
+-        return 1;
++    if (m_outStream.device())
++        m_outStream.device()->close();
+ 
+-    m_outStream.setDevice(m_outputFile);
++    m_outStream.setDevice(outputDevice);
+     m_contentPagesCount = pages;
+     m_xref.clear();
+     m_outStream << "%PDF-1.3" LINEFEED
+@@ -451,7 +440,7 @@ void PDFWriter::drawFilledRect(const QRectF& rect, const QBrush &brush)
+ 
+ QSizeF PDFWriter::size() const
+ {
+-    return QSizeF();
++    return {};
+ }
+ 
+ void PDFWriter::drawImage(const QRectF &rect)
+diff --git a/src/pdfwriter.h b/src/pdfwriter.h
+index c0d6d8b..a6f379c 100644
+--- a/src/pdfwriter.h
++++ b/src/pdfwriter.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,22 +20,17 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef PDFWRITER_H
+-#define PDFWRITER_H
++#pragma once
+ 
+ #include "types.h"
+ #include "paintcanvasinterface.h"
+ #include <QRgb>
+ #include <QTextStream>
+ 
+-QT_BEGIN_NAMESPACE
+-class QFile;
+-QT_END_NAMESPACE
+-
+ class PDFWriter: public QObject, public PaintCanvasInterface
+ {
+ public:
+-    PDFWriter(QObject *parent = 0);
++    PDFWriter(QObject *parent = nullptr);
+ 
+     void addOffsetToXref();
+     int addImageResourcesAndXObject();
+@@ -43,26 +38,23 @@ public:
+     int saveImage(const QByteArray &imageData, const QSize &sizePixels, int bitPerPixel, Types::ColorTypes colorType, const QVector<QRgb> &colorTable);
+     int startPage();
+     int finishPage();
+-    int startSaving(const QString &fileName, int pages, qreal widthCm, qreal heightCm);
++    int startSaving(QIODevice *outputDevice, int pages, qreal widthCm, qreal heightCm);
+     int finishSaving();
+-    void drawFilledRect(const QRectF&, const QBrush &brush);
+-    QSizeF size() const;
+-    void drawImage(const QRectF &rect);
+-    void drawOverlayText(const QPointF &position, int flags, int size, const QString &text);
++    void drawFilledRect(const QRectF&, const QBrush &brush) override;
++    QSizeF size() const override;
++    void drawImage(const QRectF &rect) override;
++    void drawOverlayText(const QPointF &position, int flags, int size, const QString &text) override;
+ 
+ private:
+-    QFile *m_outputFile;
+     QString m_xref;
+-    int m_pdfObjectCount;
+-    int m_contentPagesCount;
+-    int m_objectPagesID;
+-    int m_firstPageID;
+-    int m_objectResourcesID;
+-    int m_objectImageID;
+-    qreal m_mediaboxWidth;
+-    qreal m_mediaboxHeight;
++    int m_pdfObjectCount = 0;
++    int m_contentPagesCount = 0;
++    int m_objectPagesID = 0;
++    int m_firstPageID = 5; // will be ++ed if the image has a SMask
++    int m_objectResourcesID = 0;
++    int m_objectImageID = 0;
++    qreal m_mediaboxWidth = 5000.0;
++    qreal m_mediaboxHeight = 5000.0;
+     QString m_pageContent;
+     QTextStream m_outStream;
+ };
+-
+-#endif // PDFWRITER_H
+diff --git a/src/posterazor.pro b/src/posterazor.pro
+index f88d3c3..2bd1a69 100644
+--- a/src/posterazor.pro
++++ b/src/posterazor.pro
+@@ -1,6 +1,6 @@
+ TARGET = PosteRazor
+ 
+-isEqual(QT_MAJOR_VERSION, 5):QT += widgets printsupport
++QT += widgets printsupport
+ 
+ DESTDIR = $$PWD
+ 
+@@ -65,14 +65,6 @@ contains (DEFINES, FREEIMAGE_LIB) {
+ 
+     unix:LIBS += \
+         -lfreeimage
+-} else {
+-    contains(CONFIG, static) {
+-        QTPLUGIN += \
+-            qgif \
+-            qjpeg \
+-            qsvg \
+-            qtiff
+-    }
+ }
+ 
+ include (posterazor.pri)
+diff --git a/src/posterazorcore.cpp b/src/posterazorcore.cpp
+index e2a4117..3542e44 100644
+--- a/src/posterazorcore.cpp
++++ b/src/posterazorcore.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,17 +20,20 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#include "posterazorcore.h"
+ #include "pdfwriter.h"
++#include "posterazorcore.h"
+ #if defined (FREEIMAGE_LIB)
+ #    include "imageloaderfreeimage.h"
+ #else
+ #    include "imageloaderqt.h"
+ #endif
++
++#include <QBrush>
++#include <QFile>
+ #include <QSettings>
+ #include <QStringList>
+-#include <QBrush>
+-#include <math.h>
++
++#include <cmath>
+ 
+ const QLatin1String defaultValue_PaperFormat(           "DIN A4");
+ 
+@@ -55,23 +58,7 @@ const QLatin1String settingsKey_UnitOfLength(           "UnitOfLength");
+ PosteRazorCore::PosteRazorCore(ImageLoaderInterface *imageLoader, QObject *parent)
+     : QObject(parent)
+     , m_imageLoader(imageLoader)
+-    , m_posterSizeMode(Types::PosterSizeModePages)
+-    , m_posterDimension(2.0)
+-    , m_posterDimensionIsWidth(true)
+-    , m_posterAlignment(Qt::AlignCenter)
+-    , m_usesCustomPaperSize(false)
+     , m_paperFormat(defaultValue_PaperFormat)
+-    , m_paperOrientation(QPrinter::Portrait)
+-    , m_paperBorderTop(1.5)
+-    , m_paperBorderRight(1.5)
+-    , m_paperBorderBottom(1.5)
+-    , m_paperBorderLeft(1.5)
+-    , m_customPaperWidth(20)
+-    , m_customPaperHeight(20)
+-    , m_overlappingWidth(1.0)
+-    , m_overlappingHeight(1.0)
+-    , m_overlappingPosition(Qt::AlignBottom | Qt::AlignRight)
+-    , m_unitOfLength(Types::UnitOfLengthCentimeter)
+ {
+     Q_ASSERT(m_imageLoader);
+ }
+@@ -142,7 +129,7 @@ qreal PosteRazorCore::convertDistanceToCm(qreal distance) const
+ 
+ QSizeF PosteRazorCore::convertSizeToCm(const QSizeF &size) const
+ {
+-    return QSizeF(convertDistanceToCm(size.width()), convertDistanceToCm(size.height()));
++    return {convertDistanceToCm(size.width()), convertDistanceToCm(size.height())};
+ }
+ 
+ qreal PosteRazorCore::convertCmToDistance(qreal cm) const
+@@ -152,7 +139,7 @@ qreal PosteRazorCore::convertCmToDistance(qreal cm) const
+ 
+ QSizeF PosteRazorCore::convertCmToSize(const QSizeF &sizeInCm) const
+ {
+-    return QSizeF(convertCmToDistance(sizeInCm.width()), convertCmToDistance(sizeInCm.height()));
++    return {convertCmToDistance(sizeInCm.width()), convertCmToDistance(sizeInCm.height())};
+ }
+ 
+ bool PosteRazorCore::loadInputImage(const QString &imageFileName, QString &errorMessage)
+@@ -314,10 +301,10 @@ QSizeF PosteRazorCore::customPaperSize() const
+     const qreal minimalPaperHeight = minimalPaperWidth;
+     const qreal maximalPaperWidth = 500.0; // 5 meter = maximum of a PDF page.
+     const qreal maximalPaperHeight = maximalPaperWidth;
+-    return QSizeF(
++    return {
+         convertCmToDistance(qBound(minimalPaperWidth, m_customPaperWidth, maximalPaperWidth)),
+         convertCmToDistance(qBound(minimalPaperHeight, m_customPaperHeight, maximalPaperHeight))
+-    );
++    };
+ }
+ 
+ void PosteRazorCore::setUseCustomPaperSize(bool useIt)
+@@ -338,10 +325,10 @@ QSizeF PosteRazorCore::paperSize() const
+ 
+ QSizeF PosteRazorCore::printablePaperAreaSize() const
+ {
+-    return QSizeF(
++    return {
+         paperSize().width() - paperBorderLeft() - paperBorderRight(),
+         paperSize().height() - paperBorderTop() - paperBorderBottom()
+-    );
++    };
+ }
+ 
+ qreal PosteRazorCore::convertBetweenAbsoluteAndPagesPosterDimension(qreal dimension, bool pagesToAbsolute, bool width) const
+@@ -371,7 +358,7 @@ qreal PosteRazorCore::convertBetweenAbsoluteAndPagesPosterDimension(qreal dimens
+         if (posterDimension >= printablePaperAreaDimension) {
+             posterDimension -= printablePaperAreaDimension;
+             posterDimensionPages += 1.0;
+-        } else if (posterDimension < printablePaperAreaDimension) {
++        } else {
+             posterDimensionPages = posterDimension / printablePaperAreaDimension;
+             posterDimension = 0;
+         }
+@@ -481,12 +468,7 @@ qreal PosteRazorCore::posterDimension(Types::PosterSizeModes mode, bool width) c
+ {
+     qreal posterDimension = (width == m_posterDimensionIsWidth) ? m_posterDimension : calculateOtherPosterDimension();
+ 
+-    posterDimension = qMax(
+-        (mode == Types::PosterSizeModeAbsolute) ? 0.001
+-        : (mode == Types::PosterSizeModePages) ? 0.001
+-        : 0.001
+-        , posterDimension
+-    );
++    posterDimension = qMax(0.001 , posterDimension);
+ 
+     // anything to convert?
+     if (posterSizeMode() != mode){
+@@ -519,7 +501,7 @@ qreal PosteRazorCore::posterDimension(Types::PosterSizeModes mode, bool width) c
+ 
+ QSizeF PosteRazorCore::posterSize(Types::PosterSizeModes mode) const
+ {
+-    return QSizeF(posterDimension(mode, true), posterDimension(mode, false));
++    return {posterDimension(mode, true), posterDimension(mode, false)};
+ }
+ 
+ Types::PosterSizeModes PosteRazorCore::posterSizeMode() const
+@@ -649,13 +631,13 @@ void PosteRazorCore::paintPosterOnCanvasOverlapped(PaintCanvasInterface *paintCa
+         QRectF(
+             QPointF(
+                 (
+-                    alignment & Qt::AlignLeft ? borderLeft
+-                    : alignment & Qt::AlignHCenter ? qBound(borderLeft, (boxSize.width() - imageSize.width()) / 2, borderLeft + posterPrintableAreaSize.width() - imageSize.width())
++                    (alignment & Qt::AlignLeft) ? borderLeft
++                    : (alignment & Qt::AlignHCenter) ? qBound(borderLeft, (boxSize.width() - imageSize.width()) / 2, borderLeft + posterPrintableAreaSize.width() - imageSize.width())
+                     : (borderLeft + posterPrintableAreaSize.width() - imageSize.width())
+                 ) + offset.x(),
+                 (
+-                    alignment & Qt::AlignTop ? borderTop
+-                    : alignment & Qt::AlignVCenter ? qBound(borderTop, (boxSize.height() - imageSize.height()) / 2, borderTop + posterPrintableAreaSize.height() - imageSize.height())
++                    (alignment & Qt::AlignTop) ? borderTop
++                    : (alignment & Qt::AlignVCenter) ? qBound(borderTop, (boxSize.height() - imageSize.height()) / 2, borderTop + posterPrintableAreaSize.height() - imageSize.height())
+                     : (borderTop + posterPrintableAreaSize.height() - imageSize.height())
+                 ) + offset.y()
+             ),
+@@ -737,14 +719,14 @@ void PosteRazorCore::paintPosterPageOnCanvas(PaintCanvasInterface *paintCanvas,
+     );
+     const Qt::Alignment alignment = posterAlignment();
+     qreal imageOffsetFromLeftPosterBorderCm = (
+-        alignment & Qt::AlignRight ? posterTotalSizeCm.width() - posterImageSizeCm.width() - borderLeftCm
+-        : alignment & Qt::AlignHCenter ? (posterTotalSizeCm.width() - posterImageSizeCm.width()) / 2 - borderLeftCm
++        (alignment & Qt::AlignRight) ? posterTotalSizeCm.width() - posterImageSizeCm.width() - borderLeftCm
++        : (alignment & Qt::AlignHCenter) ? (posterTotalSizeCm.width() - posterImageSizeCm.width()) / 2 - borderLeftCm
+         : -borderLeftCm
+     );
+     imageOffsetFromLeftPosterBorderCm = qBound(.0, imageOffsetFromLeftPosterBorderCm, posterTotalSizeCm.width() - posterImageSizeCm.width() - borderLeftCm - borderRightCm);
+     qreal imageOffsetFromTopPosterBorderCm = (
+-        alignment & Qt::AlignBottom ? posterTotalSizeCm.height() - posterImageSizeCm.height() - borderTopCm
+-        : alignment & Qt::AlignVCenter ? (posterTotalSizeCm.height() - posterImageSizeCm.height()) / 2 - borderTopCm
++        (alignment & Qt::AlignBottom) ? posterTotalSizeCm.height() - posterImageSizeCm.height() - borderTopCm
++        : (alignment & Qt::AlignVCenter) ? (posterTotalSizeCm.height() - posterImageSizeCm.height()) / 2 - borderTopCm
+         : -borderTopCm
+     );
+     imageOffsetFromTopPosterBorderCm = qBound(.0, imageOffsetFromTopPosterBorderCm, posterTotalSizeCm.height() - posterImageSizeCm.height() - borderTopCm - borderBottomCm);
+@@ -783,7 +765,7 @@ void PosteRazorCore::paintOnCanvas(PaintCanvasInterface *paintCanvas, const QVar
+     }
+ }
+ 
+-int PosteRazorCore::savePoster(const QString &fileName) const
++int PosteRazorCore::savePoster(QIODevice *outputDevice) const
+ {
+     int err = 0;
+ 
+@@ -794,7 +776,7 @@ int PosteRazorCore::savePoster(const QString &fileName) const
+     const QByteArray imageData = m_imageLoader->bits();
+ 
+     PDFWriter pdfWriter;
+-    err = pdfWriter.startSaving(fileName, pagesCount, sizeCm.width(), sizeCm.height());
++    err = pdfWriter.startSaving(outputDevice, pagesCount, sizeCm.width(), sizeCm.height());
+     if (!err) {
+         if (m_imageLoader->isJpeg())
+             err = pdfWriter.saveJpegImage(m_imageLoader->fileName(), imageSize, m_imageLoader->colorDataType());
+diff --git a/src/posterazorcore.h b/src/posterazorcore.h
+index 27c30f8..b7c5ee8 100644
+--- a/src/posterazorcore.h
++++ b/src/posterazorcore.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,7 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef POSTERAZORCORE_H
+-#define POSTERAZORCORE_H
++#pragma once
+ 
+ #include "types.h"
+ #include "paintcanvasinterface.h"
+@@ -38,7 +37,7 @@ class PosteRazorCore: public QObject
+     Q_OBJECT
+ 
+ public:
+-    PosteRazorCore(ImageLoaderInterface *imageLoader, QObject *parent = 0);
++    PosteRazorCore(ImageLoaderInterface *imageLoader, QObject *parent = nullptr);
+ 
+     static unsigned int imageBitsPerLineCount(int widthPixels, int bitPerPixel);
+     static unsigned int imageBytesPerLineCount(int widthPixels, int bitPerPixel);
+@@ -47,7 +46,7 @@ public:
+     void readSettings(const QSettings *settings);
+     void writeSettings(QSettings *settings) const;
+     bool loadInputImage(const QString &imageFileName, QString &errorMessage);
+-    int savePoster(const QString &fileName) const;
++    int savePoster(QIODevice *outputDevice) const;
+ 
+     QSize inputImageSizePixels() const;
+     qreal inputImageHorizontalDpi() const;
+@@ -127,24 +126,22 @@ signals:
+     void previewImageChanged(const QImage &image) const;
+ 
+ private:
+-    ImageLoaderInterface*    m_imageLoader;
+-    Types::PosterSizeModes   m_posterSizeMode;
+-    qreal                   m_posterDimension;
+-    bool                     m_posterDimensionIsWidth;
+-    Qt::Alignment            m_posterAlignment;
+-    bool                     m_usesCustomPaperSize;
+-    QString                  m_paperFormat;
+-    QPrinter::Orientation    m_paperOrientation;
+-    qreal                   m_paperBorderTop;
+-    qreal                   m_paperBorderRight;
+-    qreal                   m_paperBorderBottom;
+-    qreal                   m_paperBorderLeft;
+-    qreal                   m_customPaperWidth;
+-    qreal                   m_customPaperHeight;
+-    qreal                   m_overlappingWidth;
+-    qreal                   m_overlappingHeight;
+-    Qt::Alignment            m_overlappingPosition;
+-    Types::UnitsOfLength     m_unitOfLength;
++    ImageLoaderInterface* m_imageLoader = nullptr;
++    Types::PosterSizeModes m_posterSizeMode = Types::PosterSizeModePages;
++    qreal m_posterDimension = 2.0;
++    bool m_posterDimensionIsWidth = true;
++    Qt::Alignment m_posterAlignment = Qt::AlignCenter;
++    bool m_usesCustomPaperSize = false;
++    QString m_paperFormat;
++    QPrinter::Orientation m_paperOrientation = QPrinter::Portrait;
++    qreal m_paperBorderTop = 1.5;
++    qreal m_paperBorderRight = 1.5;
++    qreal m_paperBorderBottom = 1.5;
++    qreal m_paperBorderLeft = 1.5;
++    qreal m_customPaperWidth = 20.0;
++    qreal m_customPaperHeight = 20.0;
++    qreal m_overlappingWidth = 1.0;
++    qreal m_overlappingHeight = 1.0;
++    Qt::Alignment m_overlappingPosition = Qt::AlignBottom | Qt::AlignRight;
++    Types::UnitsOfLength m_unitOfLength = Types::UnitOfLengthCentimeter;
+ };
+-
+-#endif // POSTERAZORCORE_H
+diff --git a/src/snapspinbox.cpp b/src/snapspinbox.cpp
+index 838fa75..f454521 100644
+--- a/src/snapspinbox.cpp
++++ b/src/snapspinbox.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -24,7 +24,6 @@
+ 
+ SnapSpinBox::SnapSpinBox(QWidget *parent)
+     : QDoubleSpinBox(parent)
+-    , m_originalValue(.0)
+ {
+     connect((const QObject *)lineEdit(), SIGNAL(textEdited(const QString &)), SLOT(handleLineEditTextEdited(const QString &)));
+ }
+diff --git a/src/snapspinbox.h b/src/snapspinbox.h
+index ca499ec..608578b 100644
+--- a/src/snapspinbox.h
++++ b/src/snapspinbox.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,7 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef SNAPSPINBOX_H
+-#define SNAPSPINBOX_H
++#pragma once
+ 
+ #include <QDoubleSpinBox>
+ 
+@@ -39,15 +38,13 @@ public:
+     void setValue(qreal value);
+ 
+ protected:
+-    qreal m_originalValue; // This is not rounded
+-    QAbstractSpinBox::StepEnabled stepEnabled() const;
++    qreal m_originalValue = 0.0; // This is not rounded
++    QAbstractSpinBox::StepEnabled stepEnabled() const override;
+ 
+ private slots:
+     void handleLineEditTextEdited(const QString &text);
+-    void stepBy(int steps);
++    void stepBy(int steps) override;
+ 
+ signals:
+     void valueEdited(qreal value) const;
+ };
+-
+-#endif // SNAPSPINBOX_H
+diff --git a/src/tst_posterazor.cpp b/src/tst_posterazor.cpp
+index 8ee9398..c951533 100644
+--- a/src/tst_posterazor.cpp
++++ b/src/tst_posterazor.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -33,12 +33,6 @@
+ #include <QtGui>
+ #include <QtWidgets>
+ 
+-#if !defined(QT_SHARED) && !defined(QT_DLL) && !defined(FREEIMAGE_LIB)
+-Q_IMPORT_PLUGIN(qgif)
+-Q_IMPORT_PLUGIN(qjpeg)
+-Q_IMPORT_PLUGIN(qtiff)
+-#endif
+-
+ class PosteRazorTests: public QObject
+ {
+     Q_OBJECT
+@@ -60,9 +54,7 @@ const QColor PosteRazorTests::m_screenShotBackground = Qt::white;
+ void PosteRazorTests::initTestCase()
+ {
+     QCoreApplication::setApplicationName("PosteRazor");
+-#if QT_VERSION >= 0x040400
+-    QCoreApplication::setApplicationVersion("1.9.5");
+-#endif
++    QCoreApplication::setApplicationVersion("1.9.7");
+     QCoreApplication::setOrganizationName("CasaPortale");
+     QCoreApplication::setOrganizationDomain("de.casaportale");
+ }
+@@ -92,10 +84,10 @@ void PosteRazorTests::screenShotterize()
+         QTest::qWaitForWindowExposed(&window);
+         QTest::qWait(500); // Wait for fancy effects to finish
+ 
+-        QPushButton *nextButton = window.findChild<QPushButton*>(QString::fromLatin1("m_stepNextButton"));
+-        QTabWidget *paperFormatCustomTabs = window.findChild<QTabWidget*>(QString::fromLatin1("m_paperFormatTypeTabs"));
+-        QWidget *paperFormatStandardTab = window.findChild<QWidget*>(QString::fromLatin1("m_paperFormatStandardTab"));
+-        QWidget *paperFormatCustomTab = window.findChild<QWidget*>(QString::fromLatin1("m_paperFormatCustomTab"));
++        auto nextButton = window.findChild<QPushButton*>(QString::fromLatin1("m_stepNextButton"));
++        auto paperFormatCustomTabs = window.findChild<QTabWidget*>(QString::fromLatin1("m_paperFormatTypeTabs"));
++        auto paperFormatStandardTab = window.findChild<QWidget*>(QString::fromLatin1("m_paperFormatStandardTab"));
++        auto paperFormatCustomTab = window.findChild<QWidget*>(QString::fromLatin1("m_paperFormatCustomTab"));
+ 
+         const QString screenShotFileNameTemplate =
+                 QString::fromLatin1("ScreenShot-%1-%2-%3.png")
+@@ -128,7 +120,7 @@ void PosteRazorTests::screenShotterize()
+ 
+ static inline bool imageRowHasUniqueColor(const QImage &image, int row, const QColor &color)
+ {
+-    const QRgb *rowData = reinterpret_cast<const QRgb*>(image.scanLine(row));
++    auto rowData = reinterpret_cast<const QRgb*>(image.scanLine(row));
+     const QRgb colorRgba = color.rgba();
+     for (int i = 0; i < image.width(); ++i)
+         if (*(rowData++) != colorRgba)
+diff --git a/src/tst_posterazor.pro b/src/tst_posterazor.pro
+index 383d048..f9cd1a8 100644
+--- a/src/tst_posterazor.pro
++++ b/src/tst_posterazor.pro
+@@ -24,16 +24,6 @@ contains (DEFINES, FREEIMAGE_LIB) {
+ 
+     unix:LIBS += \
+         -lfreeimage
+-} else {
+-    contains(CONFIG, static) {
+-        QTPLUGIN += \
+-            qgif \
+-            qjpeg \
+-            qsvg \
+-            qtiff
+-    }
+ }
+ 
+ include (posterazor.pri)
+-
+-!contains(CONFIG, build_pass) system(lrelease posterazor.pro)
+diff --git a/src/types.cpp b/src/types.cpp
+index 98edad1..c8302ca 100644
+--- a/src/types.cpp
++++ b/src/types.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -21,29 +21,20 @@
+ */
+ 
+ #include "types.h"
+-#include <QtDebug>
++
+ #include <QRegExp>
++#include <QtDebug>
+ 
+ const QHash<Types::UnitsOfLength, QPair<QString, qreal> > &Types::unitsOfLength()
+ {
+-    static QHash<UnitsOfLength, QPair<QString, qreal> > units;
+-    if (units.empty()) {
+-        static const struct {
+-            UnitsOfLength unit;
+-            QString name;
+-            qreal cm;
+-        } unitsOfLength[] = {
+-            {UnitOfLengthMeter,      QLatin1String("m"),        100.00},
+-            {UnitOfLengthMillimeter, QLatin1String("mm"),         0.10},
+-            {UnitOfLengthCentimeter, QLatin1String("cm"),         1.00},
+-            {UnitOfLengthInch,       QLatin1String("in"),         2.54},
+-            {UnitOfLengthFeet,       QLatin1String("ft"), 2.54 * 12.00},
+-            {UnitOfLengthPoints,     QLatin1String("pt"), 2.54 / 72.00}
+-        };
+-        static const int unitsOfLengthCount = int(sizeof unitsOfLength / sizeof unitsOfLength[0]);
+-        for (int i = 0; i < unitsOfLengthCount; i++)
+-            units.insert(unitsOfLength[i].unit, QPair<QString, qreal> (unitsOfLength[i].name, unitsOfLength[i].cm));
+-    }
++    const static QHash<UnitsOfLength, QPair<QString, qreal> > units = {
++        {UnitOfLengthMeter,         {QLatin1String("m"),        100.00}},
++        {UnitOfLengthMillimeter,    {QLatin1String("mm"),         0.10}},
++        {UnitOfLengthCentimeter,    {QLatin1String("cm"),         1.00}},
++        {UnitOfLengthInch,          {QLatin1String("in"),         2.54}},
++        {UnitOfLengthFeet,          {QLatin1String("ft"), 2.54 * 12.00}},
++        {UnitOfLengthPoints,        {QLatin1String("pt"), 2.54 / 72.00}}
++    };
+     return units;
+ }
+ 
+@@ -61,10 +52,10 @@ qreal Types::convertBetweenUnitsOfLength(qreal distance, UnitsOfLength sourceUni
+ 
+ QSizeF Types::convertBetweenUnitsOfLength(const QSizeF &size, UnitsOfLength sourceUnit, UnitsOfLength targetUnit)
+ {
+-    return QSizeF(
++    return {
+         convertBetweenUnitsOfLength(size.width(), sourceUnit, targetUnit),
+         convertBetweenUnitsOfLength(size.height(), sourceUnit, targetUnit)
+-    );
++    };
+ }
+ 
+ Types::UnitsOfLength Types::unitOfLenthFromString(const QString &string)
+@@ -80,23 +71,14 @@ Types::UnitsOfLength Types::unitOfLenthFromString(const QString &string)
+ 
+ const QHash<QString, QSizeF> &Types::paperFormats()
+ {
+-    static QHash<QString, QSizeF> formats;
+-    if (formats.empty()) {
+-        static const struct {
+-            QString name;
+-            qreal width;
+-            qreal height;
+-        } paperFormats[] = {
+-            {QLatin1String("DIN A4"),    21.0, 29.7},
+-            {QLatin1String("DIN A3"),    29.7, 42.0},
+-            {QLatin1String("Legal"),     21.6, 35.6},
+-            {QLatin1String("Letter"),    21.6, 27.9},
+-            {QLatin1String("Tabloid"),   27.9, 43.2}
+-        };
+-        static const int paperFormatsCount = int(sizeof paperFormats / sizeof paperFormats[0]);
+-        for (int i = 0; i < paperFormatsCount; i++)
+-            formats.insert(paperFormats[i].name, QSizeF(paperFormats[i].width, paperFormats[i].height));
+-    }
++    const static QHash<QString, QSizeF> formats =
++    {
++        {QLatin1String("DIN A4"),   {21.0, 29.7}},
++        {QLatin1String("DIN A3"),   {29.7, 42.0}},
++        {QLatin1String("Legal"),    {21.6, 35.6}},
++        {QLatin1String("Letter"),   {21.6, 27.9}},
++        {QLatin1String("Tabloid"),  {27.9, 43.2}}
++    };
+     return formats;
+ }
+ 
+diff --git a/src/types.h b/src/types.h
+index a7d87ef..b426201 100644
+--- a/src/types.h
++++ b/src/types.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,7 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef TYPES_H
+-#define TYPES_H
++#pragma once
+ 
+ #include <QPair>
+ #include <QPrinter>
+@@ -65,5 +64,3 @@ public:
+     static QString cleanString(const QString &dirtyString);
+     static QString newlineToParagraph(const QString &nlText);
+ };
+-
+-#endif // TYPES_H
+diff --git a/src/wizard.cpp b/src/wizard.cpp
+index e0aa8bf..e5159b6 100644
+--- a/src/wizard.cpp
++++ b/src/wizard.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -21,12 +21,13 @@
+ */
+ 
+ #include "wizard.h"
+-#include <QSignalMapper>
+-#include <QFileInfo>
+-#include <QtDebug>
+-#include <QVBoxLayout>
++
+ #include <QDialogButtonBox>
++#include <QFileInfo>
+ #include <QMessageBox>
++#include <QSignalMapper>
++#include <QVBoxLayout>
++#include <QtDebug>
+ 
+ Wizard::Wizard(QWidget *parent)
+     : QWidget(parent)
+@@ -38,42 +39,34 @@ Wizard::Wizard(QWidget *parent)
+     m_stepHelpButton->setMinimumSize(m_imageLoadButton->sizeHint());
+     m_savePosterButton->setIcon(QApplication::style()->standardPixmap(QStyle::SP_DialogSaveButton));
+ 
+-    const struct {
+-        QAbstractButton *sender;
+-        Qt::Alignment alignment;
+-    } alignmentMap[] = {
+-        {m_posterAlignmentTopLeftButton,     Qt::AlignTop | Qt::AlignLeft        },
+-        {m_posterAlignmentTopButton,         Qt::AlignTop | Qt::AlignHCenter     },
+-        {m_posterAlignmentTopRightButton,    Qt::AlignTop | Qt::AlignRight       },
+-        {m_posterAlignmentLeftButton,        Qt::AlignVCenter | Qt::AlignLeft    },
+-        {m_posterAlignmentCenterButton,      Qt::AlignCenter                     },
+-        {m_posterAlignmentRightButton,       Qt::AlignVCenter | Qt::AlignRight   },
+-        {m_posterAlignmentBottomLeftButton,  Qt::AlignBottom | Qt::AlignLeft     },
+-        {m_posterAlignmentBottomButton,      Qt::AlignBottom | Qt::AlignHCenter  },
+-        {m_posterAlignmentBottomRightButton, Qt::AlignBottom | Qt::AlignRight    }
++    m_overlappingButtons = {
++        {Qt::AlignTop | Qt::AlignLeft,          m_overlappingPositionTopLeftButton      },
++        {Qt::AlignTop | Qt::AlignRight,         m_overlappingPositionTopRightButton     },
++        {Qt::AlignBottom | Qt::AlignLeft,       m_overlappingPositionBottomLeftButton   },
++        {Qt::AlignBottom | Qt::AlignRight,      m_overlappingPositionBottomRightButton  }
+     };
+-    static const int alignmentMapCount = int(sizeof alignmentMap / sizeof alignmentMap[0]);
+-    for (int i = 0; i < alignmentMapCount; i++)
+-        m_alignmentButtons.insert(alignmentMap[i].alignment, alignmentMap[i].sender);
+-
+-    const struct {
+-        QAbstractButton *sender;
+-        Qt::Alignment alignment;
+-    } overlappingMap[] = {
+-        {m_overlappingPositionTopLeftButton,     Qt::AlignTop | Qt::AlignLeft     },
+-        {m_overlappingPositionTopRightButton,    Qt::AlignTop | Qt::AlignRight    },
+-        {m_overlappingPositionBottomLeftButton,  Qt::AlignBottom | Qt::AlignLeft  },
+-        {m_overlappingPositionBottomRightButton, Qt::AlignBottom | Qt::AlignRight }
++
++    m_alignmentButtons = {
++        {Qt::AlignTop | Qt::AlignLeft,          m_posterAlignmentTopLeftButton          },
++        {Qt::AlignTop | Qt::AlignHCenter,       m_posterAlignmentTopButton              },
++        {Qt::AlignTop | Qt::AlignRight,         m_posterAlignmentTopRightButton         },
++        {Qt::AlignVCenter | Qt::AlignLeft,      m_posterAlignmentLeftButton             },
++        {Qt::AlignCenter,                       m_posterAlignmentCenterButton           },
++        {Qt::AlignVCenter | Qt::AlignRight,     m_posterAlignmentRightButton            },
++        {Qt::AlignBottom | Qt::AlignLeft,       m_posterAlignmentBottomLeftButton       },
++        {Qt::AlignBottom | Qt::AlignHCenter,    m_posterAlignmentBottomButton           },
++        {Qt::AlignBottom | Qt::AlignRight,      m_posterAlignmentBottomRightButton      }
+     };
+-    static const int overlappingMapCount = int(sizeof overlappingMap / sizeof overlappingMap[0]);
+-    for (int i = 0; i < overlappingMapCount; i++)
+-        m_overlappingButtons.insert(overlappingMap[i].alignment, overlappingMap[i].sender);
+ 
+     m_steps->setCurrentIndex(0);
+     createConnections();
+     populateUI();
+     updatePosterSizeGroupsState();
+     retranslateUi();
++
++#ifdef Q_OS_WASM
++    m_launchPDFApplicationCheckBox->hide();
++#endif // Q_OS_WASM
+ }
+ 
+ void Wizard::changeEvent(QEvent *event)
+@@ -407,11 +400,11 @@ void Wizard::createConnections()
+     connect(m_posterSizePercentualRadioButton,      SIGNAL(clicked()),                  SLOT(updatePosterSizeGroupsState()));
+     connect(m_overlappingWidthInput,                SIGNAL(valueEdited(qreal)),        SIGNAL(overlappingWidthChanged(qreal)));
+     connect(m_overlappingHeightInput,               SIGNAL(valueEdited(qreal)),        SIGNAL(overlappingHeightChanged(qreal)));
+-    QSignalMapper *overlappingMapper = new QSignalMapper(this);
+-    foreach (const Qt::Alignment alignment, m_overlappingButtons.keys()) {
+-        QAbstractButton *sender = m_overlappingButtons.value(alignment);
++    auto overlappingMapper = new QSignalMapper(this);
++    for (auto it = m_overlappingButtons.cbegin(), end = m_overlappingButtons.cend(); it != end; ++it) {
++        QAbstractButton *sender = it.value();
+         connect(sender, SIGNAL(clicked()), overlappingMapper, SLOT(map()));
+-        overlappingMapper->setMapping(sender, alignment);
++        overlappingMapper->setMapping(sender, it.key());
+     }
+     connect(overlappingMapper, SIGNAL(mapped(int)), SLOT(emitOverlappingPositionChange(int)));
+     connect(m_posterAbsoluteWidthInput,             SIGNAL(valueEdited(qreal)),        SIGNAL(posterWidthAbsoluteChanged(qreal)));
+@@ -419,11 +412,11 @@ void Wizard::createConnections()
+     connect(m_posterPagesWidthInput,                SIGNAL(valueEdited(qreal)),        SIGNAL(posterWidthPagesChanged(qreal)));
+     connect(m_posterPagesHeightInput,               SIGNAL(valueEdited(qreal)),        SIGNAL(posterHeightPagesChanged(qreal)));
+     connect(m_posterPercentualSizeInput,            SIGNAL(valueEdited(qreal)),        SIGNAL(posterSizePercentualChanged(qreal)));
+-    QSignalMapper *alignmentMapper = new QSignalMapper(this);
+-    foreach (const Qt::Alignment alignment, m_alignmentButtons.keys()) {
+-        QAbstractButton *sender = m_alignmentButtons.value(alignment);
++    auto alignmentMapper = new QSignalMapper(this);
++    for (auto it = m_alignmentButtons.cbegin(), end = m_alignmentButtons.cend(); it != end; ++it) {
++        QAbstractButton *sender = it.value();
+         connect(sender, SIGNAL(clicked()), alignmentMapper, SLOT(map()));
+-        alignmentMapper->setMapping(sender, alignment);
++        alignmentMapper->setMapping(sender, it.key());
+     }
+     connect(alignmentMapper, SIGNAL(mapped(int)),   SLOT(emitPosterAlignmentChange(int)));
+     connect(m_savePosterButton,                     SIGNAL(clicked()),                  SIGNAL(savePosterSignal()));
+diff --git a/src/wizard.h b/src/wizard.h
+index b64927d..f6da58b 100644
+--- a/src/wizard.h
++++ b/src/wizard.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,7 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef WIZARD_H
+-#define WIZARD_H
++#pragma once
+ 
+ #include "ui_wizard.h"
+ #include "types.h"
+@@ -31,9 +30,9 @@ class Wizard : public QWidget, private Ui::Wizard
+     Q_OBJECT
+ 
+ public:
+-    Wizard(QWidget *parent = 0);
++    Wizard(QWidget *parent = nullptr);
+ 
+-    void changeEvent(QEvent *event);
++    void changeEvent(QEvent *event) override;
+ 
+ public slots:
+     void retranslateUi();
+@@ -117,5 +116,3 @@ private slots:
+     void emitPosterAlignmentChange(int alignmentInt) const;
+     void updatePosterSizeGroupsState();
+ };
+-
+-#endif // WIZARD_H
+diff --git a/src/wizardcontroller.cpp b/src/wizardcontroller.cpp
+index e429ff9..99aa0db 100644
+--- a/src/wizardcontroller.cpp
++++ b/src/wizardcontroller.cpp
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,11 +20,12 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#include "wizardcontroller.h"
+ #include "types.h"
++#include "wizardcontroller.h"
++
+ #include <QCoreApplication>
+-#include <QMetaObject>
+ #include <QMetaEnum>
++#include <QMetaObject>
+ 
+ static const QMetaEnum wizardStepsEnum()
+ {
+@@ -39,8 +40,6 @@ static int wizardStepsCount()
+ 
+ WizardController::WizardController(QObject *wizardDialog, QObject *parent)
+     : QObject(parent)
+-    , m_wizardStep(WizardStepInputImage)
+-    , m_imageWasLoaded(false)
+ {
+     connect(this, SIGNAL(wizardStepChanged(int)), wizardDialog, SLOT(setWizardStep(int)));
+     connect(this, SIGNAL(wizardStepDescriptionChanged(const QString&, const QString&)), wizardDialog, SLOT(setWizardStepDescription(const QString&, const QString&)));
+@@ -75,7 +74,7 @@ void WizardController::setStepAvailable(WizardSteps step, bool available)
+ WizardController::WizardSteps WizardController::previousAvailableStep()
+ {
+     for (int i = m_wizardStep; i > WizardStepInputImage; i--){
+-        const WizardSteps newStep = WizardSteps(i - 1);
++        const auto newStep = WizardSteps(i - 1);
+         if (!m_unavaliableSteps.contains(newStep))
+             return newStep;
+     }
+@@ -86,7 +85,7 @@ WizardController::WizardSteps WizardController::previousAvailableStep()
+ WizardController::WizardSteps WizardController::nextAvailableStep()
+ {
+     for (int i = m_wizardStep; i < WizardStepSavePoster; ++i){
+-        const WizardSteps newStep = WizardSteps(i + 1);
++        const auto newStep = WizardSteps(i + 1);
+         if (!m_unavaliableSteps.contains(newStep))
+             return newStep;
+     }
+@@ -110,8 +109,8 @@ void WizardController::showManual()
+         "All entries and choices are remembered until the next usage of the PosteRazor.",
+         "Manual preface. Place holders: %1 = Number of wizard steps, %2 = 'Back', %3 = 'Next' (will be automatically inserted)")
+         .arg(wizardStepsCount() - m_unavaliableSteps.count())
+-        .arg(QCoreApplication::translate("Main window", "Back"))
+-        .arg(QCoreApplication::translate("Main window", "Next"))));
++        .arg(QCoreApplication::translate("Main window", "Back"),
++             QCoreApplication::translate("Main window", "Next"))));
+     for (int i = 0; i < wizardStepsEnum().keyCount(); i++) {
+         const WizardSteps step = (WizardSteps)wizardStepsEnum().value(i);
+         if (!m_unavaliableSteps.contains(step)){
+@@ -148,8 +147,7 @@ void WizardController::updateDialogWizardStep()
+         m_wizardStep == WizardStepInputImage ?  "image"
+         : m_wizardStep == WizardStepOverlapping ? "overlapping"
+         : m_wizardStep == WizardStepPaperSize ? "paper"
+-        : m_wizardStep == WizardStepPosterSize ? "poster"
+-        : "poster"
++        : "poster" // WizardStepPosterSize, WizardStepSavePoster
+     ));
+     emit prevButtonEnabled(m_wizardStep != previousAvailableStep());
+     emit nextButtonEnabled(
+@@ -204,9 +202,9 @@ QString WizardController::stepHelp(WizardSteps step)
+             "Alternatively, a custom paper sheet size can be defined in the <b>%2</b> tab.\n"
+             "Paper borders are defined in the <b>%3</b> fields. Even if your printer does need no (or small) paper borders, some border might be needed to have enough area for gluing the final poster tiles together.",
+             "Wizard step 2. Place holders: %1 = 'Format:', %2 = 'Custom', %3 = 'Borders' (will be automatically inserted)")
+-            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Format:")))
+-            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Custom")))
+-            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Borders")));
++            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Format:")),
++                 Types::cleanString(QCoreApplication::translate("Main window", "Custom")),
++                 Types::cleanString(QCoreApplication::translate("Main window", "Borders")));
+         break;
+     case WizardStepOverlapping:
+         result = QCoreApplication::translate("Help",
+@@ -223,20 +221,20 @@ QString WizardController::stepHelp(WizardSteps step)
+             "Wizard step 4. Start of the description.");
+         result.append(QLatin1String("<dl>"));
+         result.append(definitionTemplate
+-            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Absolute size:")))
+-            .arg(QCoreApplication::translate("Help",
+-                "You want to have a specific size of your poster.",
+-                "Wizard step 4. Description for 'absolute size'")));
++                      .arg(Types::cleanString(QCoreApplication::translate("Main window", "Absolute size:")),
++                           QCoreApplication::translate("Help",
++                                                       "You want to have a specific size of your poster.",
++                                                       "Wizard step 4. Description for 'absolute size'")));
+         result.append(definitionTemplate
+-            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Size in pages:")))
+-            .arg(QCoreApplication::translate("Help",
+-                "You want to use whole paper sheets and specify how many of them you want to use.",
+-                "Wizard step 4. Description for 'size in pages'")));
++                      .arg(Types::cleanString(QCoreApplication::translate("Main window", "Size in pages:")),
++                           QCoreApplication::translate("Help",
++                                                       "You want to use whole paper sheets and specify how many of them you want to use.",
++                                                       "Wizard step 4. Description for 'size in pages'")));
+         result.append(definitionTemplate
+-            .arg(Types::cleanString(QCoreApplication::translate("Main window", "Size in percent:")))
+-            .arg(QCoreApplication::translate("Help",
+-                "Your input image has a certain size which is defined by the number of pixels and dpi (dots per Inch) and your want to enlarge the image by a certain factor.",
+-                "Wizard step 4. Description for 'size in percent'")));
++                      .arg(Types::cleanString(QCoreApplication::translate("Main window", "Size in percent:")),
++                           QCoreApplication::translate("Help",
++                                                       "Your input image has a certain size which is defined by the number of pixels and dpi (dots per Inch) and your want to enlarge the image by a certain factor.",
++                                                       "Wizard step 4. Description for 'size in percent'")));
+         result.append(QLatin1String("</dl>"));
+         result.append(QCoreApplication::translate("Help",
+             "The aspect ratio of width and height is always 1:1 and is automatically recalculated. In the preview area, you can see the overlapping areas which are surrounded by light red rectangles.\n"
+diff --git a/src/wizardcontroller.h b/src/wizardcontroller.h
+index 8cf61c0..31c6ef7 100644
+--- a/src/wizardcontroller.h
++++ b/src/wizardcontroller.h
+@@ -1,6 +1,6 @@
+ /*
+     PosteRazor - Make your own poster!
+-    Copyright (C) 2005-2009 by Alessandro Portale
++    Copyright (C) 2005-2018 by Alessandro Portale
+     http://posterazor.sourceforge.net/
+ 
+     This file is part of PosteRazor
+@@ -20,8 +20,7 @@
+     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ 
+-#ifndef WIZARDCONTROLLER_H
+-#define WIZARDCONTROLLER_H
++#pragma once
+ 
+ #include <QObject>
+ 
+@@ -39,7 +38,7 @@ public:
+         WizardStepSavePoster
+     };
+ 
+-    WizardController(QObject *wizardDialog, QObject *parent = 0);
++    WizardController(QObject *wizardDialog, QObject *parent = nullptr);
+ 
+     void setStepAvailable(WizardSteps step, bool available);
+     WizardSteps previousAvailableStep();
+@@ -66,13 +65,11 @@ signals:
+     void showWizardStepHelpSignal(const QString &title, const QString &manual) const;
+ 
+ private:
+-    WizardSteps m_wizardStep;
+-    bool m_imageWasLoaded;
++    WizardSteps m_wizardStep = WizardStepInputImage;
++    bool m_imageWasLoaded = false;
+     QList<WizardSteps> m_unavaliableSteps;
+ 
+     QString stepXofYString(WizardSteps step) const;
+     static QString stepTitle(WizardSteps step);
+     static QString stepHelp(WizardSteps step);
+ };
+-
+-#endif // WIZARDCONTROLLER_H



More information about the arch-commits mailing list