Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 947239
Collapse All | Expand All

(-)a/CMakeLists.txt (+25 lines)
Line 0 Link Here
1
cmake_minimum_required(VERSION 3.28)
2
project(diffpdf CXX)
3
4
find_package(Qt6 REQUIRED COMPONENTS LinguistTools PrintSupport Widgets)
5
find_package(PkgConfig REQUIRED)
6
pkg_search_module(PopplerQt6 REQUIRED IMPORTED_TARGET poppler-qt6>=24.11.0)
7
8
qt_standard_project_setup(REQUIRES 6.8 I18N_TRANSLATED_LANGUAGES cz de es fr)
9
10
file(GLOB DiffPDF_SOURCES CONFIGURE_DEPENDS
11
    "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp"
12
    "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp"
13
)
14
qt_add_executable(diffpdf ${DiffPDF_SOURCES})
15
target_link_libraries(diffpdf
16
  PRIVATE
17
    PkgConfig::PopplerQt6
18
    Qt6::Core
19
    Qt6::PrintSupport
20
    Qt6::Widgets
21
)
22
qt_add_translations(diffpdf RESOURCE_PREFIX "/")
23
qt_add_binary_resources(diffpdf_resources resources.qrc)
24
add_dependencies(diffpdf diffpdf_resources)
25
install(TARGETS diffpdf)
(-)a/diffpdf_cz.ts (-1 lines)
Lines 1-7 Link Here
1
<?xml version="1.0" encoding="utf-8"?>
1
<?xml version="1.0" encoding="utf-8"?>
2
<!DOCTYPE TS>
2
<!DOCTYPE TS>
3
<TS version="2.0" language="cs_CZ">
3
<TS version="2.0" language="cs_CZ">
4
<defaultcodec>UTF-8</defaultcodec>
5
<context>
4
<context>
6
    <name>AboutForm</name>
5
    <name>AboutForm</name>
7
    <message>
6
    <message>
(-)a/diffpdf_de.ts (-1 lines)
Lines 1-7 Link Here
1
<?xml version="1.0" encoding="utf-8"?>
1
<?xml version="1.0" encoding="utf-8"?>
2
<!DOCTYPE TS>
2
<!DOCTYPE TS>
3
<TS version="2.0" language="de_DE">
3
<TS version="2.0" language="de_DE">
4
<defaultcodec>UTF-8</defaultcodec>
5
<context>
4
<context>
6
    <name>AboutForm</name>
5
    <name>AboutForm</name>
7
    <message>
6
    <message>
(-)a/diffpdf_es.ts (-1 lines)
Lines 1-7 Link Here
1
<?xml version="1.0" encoding="utf-8"?>
1
<?xml version="1.0" encoding="utf-8"?>
2
<!DOCTYPE TS>
2
<!DOCTYPE TS>
3
<TS version="2.0" language="es_ES">
3
<TS version="2.0" language="es_ES">
4
<defaultcodec>UTF-8</defaultcodec>
5
<context>
4
<context>
6
    <name>AboutForm</name>
5
    <name>AboutForm</name>
7
    <message>
6
    <message>
(-)a/diffpdf_fr.ts (-1 lines)
Lines 1-7 Link Here
1
<?xml version="1.0" encoding="utf-8"?>
1
<?xml version="1.0" encoding="utf-8"?>
2
<!DOCTYPE TS>
2
<!DOCTYPE TS>
3
<TS version="2.0">
3
<TS version="2.0">
4
<defaultcodec>UTF-8</defaultcodec>
5
<context>
4
<context>
6
    <name>AboutForm</name>
5
    <name>AboutForm</name>
7
    <message>
6
    <message>
(-)a/generic.cpp (-2 / +3 lines)
Lines 17-22 Link Here
17
#include <QPen>
17
#include <QPen>
18
#include <QPixmapCache>
18
#include <QPixmapCache>
19
#include <QUrl>
19
#include <QUrl>
20
#include <utility>
20
21
21
const QSize SwatchSize(24, 24);
22
const QSize SwatchSize(24, 24);
22
23
Lines 149-156 QPixmap penStyleSwatch(const Qt::PenStyle style, const QColor &color) Link Here
149
const TextBoxList getTextBoxes(PdfPage page, const QRectF &rect)
150
const TextBoxList getTextBoxes(PdfPage page, const QRectF &rect)
150
{
151
{
151
    TextBoxList boxes;
152
    TextBoxList boxes;
152
    foreach (Poppler::TextBox *box, page->textList()) {
153
    for (auto & box : page->textList()) {
153
        PdfTextBox box_ptr(box);
154
        PdfTextBox box_ptr(std::move(box));
154
        if (rect.isEmpty() || rect.contains(box_ptr->boundingBox()))
155
        if (rect.isEmpty() || rect.contains(box_ptr->boundingBox()))
155
            boxes.append(box_ptr);
156
            boxes.append(box_ptr);
156
    }
157
    }
(-)a/generic.hpp (-13 / +7 lines)
Lines 12-18 Link Here
12
    for more details.
12
    for more details.
13
*/
13
*/
14
14
15
#include <poppler-qt5.h>
15
#include <poppler-qt6.h>
16
#include <QMetaType>
16
#include <QMetaType>
17
#include <QPair>
17
#include <QPair>
18
#include <QPixmap>
18
#include <QPixmap>
Lines 22-36 class QColor; Link Here
22
class QMimeData;
22
class QMimeData;
23
class QRectF;
23
class QRectF;
24
24
25
#if QT_VERSION >= 0x040600
25
using PdfDocument = std::shared_ptr<Poppler::Document>;
26
typedef QSharedPointer<Poppler::Document> PdfDocument;
26
using PdfPage = std::shared_ptr<Poppler::Page>;
27
typedef QSharedPointer<Poppler::Page> PdfPage;
27
using PdfTextBox = std::shared_ptr<Poppler::TextBox>;
28
typedef QSharedPointer<Poppler::TextBox> PdfTextBox;
29
#else
30
typedef std::tr1::shared_ptr<Poppler::Document> PdfDocument;
31
typedef std::tr1::shared_ptr<Poppler::Page> PdfPage;
32
typedef std::tr1::shared_ptr<Poppler::TextBox> PdfTextBox;
33
#endif
34
typedef QList<PdfTextBox> TextBoxList;
28
typedef QList<PdfTextBox> TextBoxList;
35
29
36
enum InitialComparisonMode{CompareAppearance=0, CompareCharacters=1,
30
enum InitialComparisonMode{CompareAppearance=0, CompareCharacters=1,
Lines 50-58 struct PagePair Link Here
50
44
51
    bool isNull() { return left == -1 || right == -1; }
45
    bool isNull() { return left == -1 || right == -1; }
52
46
53
    const int left;
47
    int left;
54
    const int right;
48
    int right;
55
    const bool hasVisualDifference;
49
    bool hasVisualDifference;
56
};
50
};
57
Q_DECLARE_METATYPE(PagePair)
51
Q_DECLARE_METATYPE(PagePair)
58
52
(-)a/helpform.cpp (-1 / +2 lines)
Lines 16-21 Link Here
16
#include <QKeySequence>
16
#include <QKeySequence>
17
#include <QSettings>
17
#include <QSettings>
18
#include <QShortcut>
18
#include <QShortcut>
19
#include <QStringConverter>
19
#include <QTextBrowser>
20
#include <QTextBrowser>
20
#include <QTextStream>
21
#include <QTextStream>
21
22
Lines 31-37 HelpForm::HelpForm(const QString &language, QWidget *parent) Link Here
31
    QFile file(filename);
32
    QFile file(filename);
32
    file.open(QIODevice::ReadOnly|QIODevice::Text);
33
    file.open(QIODevice::ReadOnly|QIODevice::Text);
33
    QTextStream in(&file);
34
    QTextStream in(&file);
34
    in.setCodec("UTF-8");
35
    in.setEncoding(QStringConverter::Utf8);
35
    viewer->setHtml(in.readAll());
36
    viewer->setHtml(in.readAll());
36
    viewer->setReadOnly(true);
37
    viewer->setReadOnly(true);
37
    setCentralWidget(viewer);
38
    setCentralWidget(viewer);
(-)a/main.cpp (-1 lines)
Lines 16-22 Link Here
16
#include <QLibraryInfo>
16
#include <QLibraryInfo>
17
#include <QLocale>
17
#include <QLocale>
18
#include <QSettings>
18
#include <QSettings>
19
#include <QTextCodec>
20
#include <QTextStream>
19
#include <QTextStream>
21
#include <QTranslator>
20
#include <QTranslator>
22
21
(-)a/mainwindow.cpp (-16 / +15 lines)
Lines 27-44 Link Here
27
#include <QComboBox>
27
#include <QComboBox>
28
#include <QDir>
28
#include <QDir>
29
#include <QDockWidget>
29
#include <QDockWidget>
30
#include <QElapsedTimer>
30
#include <QEvent>
31
#include <QEvent>
31
#include <QFileDialog>
32
#include <QFileDialog>
32
#include <QGroupBox>
33
#include <QGroupBox>
33
#include <QLabel>
34
#include <QLabel>
34
#include <QLineEdit>
35
#include <QLineEdit>
35
#include <QMessageBox>
36
#include <QMessageBox>
37
#include <QPageLayout>
36
#include <QPainter>
38
#include <QPainter>
37
#include <QPixmapCache>
39
#include <QPixmapCache>
38
#include <QPlainTextEdit>
40
#include <QPlainTextEdit>
39
#include <QPrinter>
41
#include <QPrinter>
40
#include <QPushButton>
42
#include <QPushButton>
41
#include <QRadioButton>
43
#include <QRadioButton>
44
#include <QRegularExpression>
42
#include <QScrollArea>
45
#include <QScrollArea>
43
#include <QScrollBar>
46
#include <QScrollBar>
44
#include <QSettings>
47
#include <QSettings>
Lines 1249-1259 PdfDocument MainWindow::getPdf(const QString &filename) Link Here
1249
    else if (pdf->isLocked()) {
1252
    else if (pdf->isLocked()) {
1250
        QMessageBox::warning(this, tr("DiffPDF — Error"),
1253
        QMessageBox::warning(this, tr("DiffPDF — Error"),
1251
                tr("Cannot read a locked PDF ('%1').").arg(filename));
1254
                tr("Cannot read a locked PDF ('%1').").arg(filename));
1252
#if QT_VERSION >= 0x040600
1255
        return {};
1253
        pdf.clear();
1254
#else
1255
        pdf.reset();
1256
#endif
1257
    }
1256
    }
1258
    return pdf;
1257
    return pdf;
1259
}
1258
}
Lines 1319-1325 QList<int> MainWindow::getPageList(int which, PdfDocument pdf) Link Here
1319
    bool error = false;
1318
    bool error = false;
1320
    QList<int> pages;
1319
    QList<int> pages;
1321
    QString page_string = pagesEdit->text();
1320
    QString page_string = pagesEdit->text();
1322
    page_string = page_string.replace(QRegExp("\\s+"), "");
1321
    static QRegularExpression spaces("\\s+");
1322
    page_string = page_string.replace(spaces, "");
1323
    QStringList page_list = page_string.split(",");
1323
    QStringList page_list = page_string.split(",");
1324
    bool ok;
1324
    bool ok;
1325
    foreach (const QString &page, page_list) {
1325
    foreach (const QString &page, page_list) {
Lines 1387-1393 void MainWindow::compare() Link Here
1387
    }
1387
    }
1388
1388
1389
    comparePrepareUi();
1389
    comparePrepareUi();
1390
    QTime time;
1390
    QElapsedTimer time;
1391
    time.start();
1391
    time.start();
1392
    const QPair<int, int> pair = comparePages(filename1, pdf1, filename2,
1392
    const QPair<int, int> pair = comparePages(filename1, pdf1, filename2,
1393
                                              pdf2);
1393
                                              pdf2);
Lines 1685-1692 void MainWindow::saveAsPdf(const int start, const int end, Link Here
1685
    printer.setOutputFormat(QPrinter::PdfFormat);
1685
    printer.setOutputFormat(QPrinter::PdfFormat);
1686
    printer.setColorMode(QPrinter::Color);
1686
    printer.setColorMode(QPrinter::Color);
1687
    printer.setCreator(tr("DiffPDF"));
1687
    printer.setCreator(tr("DiffPDF"));
1688
    printer.setOrientation(savePages == SaveBothPages
1688
    printer.setPageOrientation(savePages == SaveBothPages
1689
            ? QPrinter::Landscape : QPrinter::Portrait);
1689
            ? QPageLayout::Landscape : QPageLayout::Portrait);
1690
    QPainter painter(&printer);
1690
    QPainter painter(&printer);
1691
    painter.setRenderHints(QPainter::Antialiasing|
1691
    painter.setRenderHints(QPainter::Antialiasing|
1692
            QPainter::TextAntialiasing|QPainter::SmoothPixmapTransform);
1692
            QPainter::TextAntialiasing|QPainter::SmoothPixmapTransform);
Lines 1802-1808 void MainWindow::showZones() Link Here
1802
void MainWindow::showZones(const int Width, const TextBoxList &list,
1802
void MainWindow::showZones(const int Width, const TextBoxList &list,
1803
                           QLabel *label)
1803
                           QLabel *label)
1804
{
1804
{
1805
    if (!label || !label->pixmap() || label->pixmap()->isNull())
1805
    if (!label || label->pixmap().isNull())
1806
        return;
1806
        return;
1807
    const bool ComparingWords = compareComboBox->currentIndex() ==
1807
    const bool ComparingWords = compareComboBox->currentIndex() ==
1808
                                CompareWords;
1808
                                CompareWords;
Lines 1815-1821 void MainWindow::showZones(const int Width, const TextBoxList &list, Link Here
1815
            columnsSpinBox->value());
1815
            columnsSpinBox->value());
1816
    const int DPI = static_cast<int>(POINTS_PER_INCH *
1816
    const int DPI = static_cast<int>(POINTS_PER_INCH *
1817
            (zoomSpinBox->value() / 100.0));
1817
            (zoomSpinBox->value() / 100.0));
1818
    QPixmap pixmap = label->pixmap()->copy();
1818
    QPixmap pixmap = label->pixmap().copy();
1819
    QPainter painter(&pixmap);
1819
    QPainter painter(&pixmap);
1820
    painter.setPen(Qt::green);
1820
    painter.setPen(Qt::green);
1821
    for (int i = 0; i < paths.count(); ++i) {
1821
    for (int i = 0; i < paths.count(); ++i) {
Lines 1844-1854 void MainWindow::showMargins() Link Here
1844
1844
1845
void MainWindow::showMargins(QLabel *label)
1845
void MainWindow::showMargins(QLabel *label)
1846
{
1846
{
1847
    if (!label || !label->pixmap() || label->pixmap()->isNull())
1847
    if (!label || label->pixmap().isNull())
1848
        return;
1848
        return;
1849
    const int DPI = static_cast<int>(POINTS_PER_INCH *
1849
    const int DPI = static_cast<int>(POINTS_PER_INCH *
1850
                (zoomSpinBox->value() / 100.0));
1850
                (zoomSpinBox->value() / 100.0));
1851
    QPixmap pixmap = label->pixmap()->copy();
1851
    QPixmap pixmap = label->pixmap().copy();
1852
    QPainter painter(&pixmap);
1852
    QPainter painter(&pixmap);
1853
    painter.setPen(Qt::cyan);
1853
    painter.setPen(Qt::cyan);
1854
    int left = leftMarginSpinBox->value();
1854
    int left = leftMarginSpinBox->value();
Lines 1880-1891 void MainWindow::showMargins(QLabel *label) Link Here
1880
1880
1881
void MainWindow::setAMargin(const QPoint &pos)
1881
void MainWindow::setAMargin(const QPoint &pos)
1882
{
1882
{
1883
    if (!marginsGroupBox->isChecked() || !page1Label->pixmap() ||
1883
    if (!marginsGroupBox->isChecked() || page1Label->pixmap().isNull())
1884
        page1Label->pixmap()->isNull())
1885
        return;
1884
        return;
1886
    const int DPI = static_cast<int>(POINTS_PER_INCH *
1885
    const int DPI = static_cast<int>(POINTS_PER_INCH *
1887
                (zoomSpinBox->value() / 100.0));
1886
                (zoomSpinBox->value() / 100.0));
1888
    const QSize &size = page1Label->pixmap()->size();
1887
    const QSize &size = page1Label->pixmap().size();
1889
    int x = pos.x();
1888
    int x = pos.x();
1890
    int y = pos.y();
1889
    int y = pos.y();
1891
    const int HorizontalMiddle = size.width() / 2;
1890
    const int HorizontalMiddle = size.width() / 2;
(-)a/mainwindow.hpp (-1 / +1 lines)
Lines 19-25 Link Here
19
#else
19
#else
20
#include <tr1/memory>
20
#include <tr1/memory>
21
#endif
21
#endif
22
#include <poppler-qt5.h>
22
#include <poppler-qt6.h>
23
#include <QBrush>
23
#include <QBrush>
24
#include <QList>
24
#include <QList>
25
#include <QMainWindow>
25
#include <QMainWindow>
(-)a/resources.qrc (-3 lines)
Lines 3-11 Link Here
3
<file alias="icon.png">images/icon.png</file>
3
<file alias="icon.png">images/icon.png</file>
4
<file alias="left.png">images/left.png</file>
4
<file alias="left.png">images/left.png</file>
5
<file alias="right.png">images/right.png</file>
5
<file alias="right.png">images/right.png</file>
6
<file>diffpdf_cz.qm</file>
7
<file>diffpdf_de.qm</file>
8
<file>diffpdf_fr.qm</file>
9
<file>help.html</file>
6
<file>help.html</file>
10
<file>help_cz.html</file>
7
<file>help_cz.html</file>
11
<file>help_de.html</file>
8
<file>help_de.html</file>
(-)a/sequence_matcher.cpp (-1 / +2 lines)
Lines 11-16 Link Here
11
*/
11
*/
12
12
13
#include "sequence_matcher.hpp"
13
#include "sequence_matcher.hpp"
14
#include <algorithm>
14
#include <QSet>
15
#include <QSet>
15
16
16
17
Lines 136-142 QList<Match> SequenceMatcher::get_matching_blocks() Link Here
136
                offsets.append(Offsets(i + k, a_high, j + k, b_high));
137
                offsets.append(Offsets(i + k, a_high, j + k, b_high));
137
        }
138
        }
138
    }
139
    }
139
    qSort(matching_blocks.begin(), matching_blocks.end(), matchLessThan);
140
    std::sort(matching_blocks.begin(), matching_blocks.end(), matchLessThan);
140
141
141
    int i1 = 0;
142
    int i1 = 0;
142
    int j1 = 0;
143
    int j1 = 0;
(-)a/textitem.cpp (-1 / +2 lines)
Lines 14-19 Link Here
14
14
15
#include <QDir>
15
#include <QDir>
16
#include <QFile>
16
#include <QFile>
17
#include <QStringConverter>
17
#include <QTextStream>
18
#include <QTextStream>
18
19
19
20
Lines 152-158 void TextItems::debug(const int page, const int ToleranceY, Link Here
152
                                .arg(file.errorString())));
153
                                .arg(file.errorString())));
153
    }
154
    }
154
    QTextStream out(&file);
155
    QTextStream out(&file);
155
    out.setCodec("UTF-8");
156
    out.setEncoding(QStringConverter::Utf8);
156
    out << "Page #" << page << ": "
157
    out << "Page #" << page << ": "
157
        << (ComparingWords ? "Words" : "Characters") << " mode\n";
158
        << (ComparingWords ? "Words" : "Characters") << " mode\n";
158
    for (int i = 0; i < items.count(); ++i) {
159
    for (int i = 0; i < items.count(); ++i) {

Return to bug 947239