qt4/src/ArthurOutputDev.cc | 18 ++++----- qt4/tests/CMakeLists.txt | 1 qt4/tests/Makefile.am | 8 +++- qt4/tests/test-render-to-file.cpp | 69 ++++++++++++++++++++++++++++++++++++++ qt5/src/ArthurOutputDev.cc | 18 ++++----- qt5/tests/CMakeLists.txt | 1 qt5/tests/Makefile.am | 8 +++- qt5/tests/test-render-to-file.cpp | 69 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 172 insertions(+), 20 deletions(-)
New commits: commit 44cf2de0df351d5948893f6a4e2bca1168d16b70 Author: Dominik Haumann <[email protected]> Date: Thu Dec 12 23:12:35 2013 +0100 Arthur font rendering improvements The patch does does the following: - use NoPen to fill the glyphs - since SplashPath seems to bitwise OR stop and start of path, closing a subpath needs to happen before starting a path. Arthur needs serious work but this is a definite improvement in all the files i've tried it on diff --git a/qt4/src/ArthurOutputDev.cc b/qt4/src/ArthurOutputDev.cc index 5d57e93..914edb9 100644 --- a/qt4/src/ArthurOutputDev.cc +++ b/qt4/src/ArthurOutputDev.cc @@ -21,6 +21,7 @@ // Copyright (C) 2010 Matthias Fauconneau <[email protected]> // Copyright (C) 2011 Andreas Hartmetz <[email protected]> // Copyright (C) 2013 Thomas Freitag <[email protected]> +// Copyright (C) 2013 Dominik Haumann <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -593,10 +594,15 @@ void ArthurOutputDev::drawChar(GfxState *state, double x, double y, QPainterPath qPath; qPath.setFillRule(Qt::WindingFill); for (int i = 0; i < fontPath->length; ++i) { + // SplashPath.flags: bitwise or allowed + if (fontPath->flags[i] & splashPathLast || fontPath->flags[i] & splashPathClosed) { + qPath.closeSubpath(); + } if (fontPath->flags[i] & splashPathFirst) { state->transform(fontPath->pts[i].x+x, -fontPath->pts[i].y+y, &x1, &y1); qPath.moveTo(x1,y1); - } else if (fontPath->flags[i] & splashPathCurve) { + } + if (fontPath->flags[i] & splashPathCurve) { state->transform(fontPath->pts[i].x+x, -fontPath->pts[i].y+y, &x1, &y1); state->transform(fontPath->pts[i+1].x+x, -fontPath->pts[i+1].y+y, &x2, &y2); qPath.quadTo(x1,y1,x2,y2); @@ -610,20 +616,14 @@ void ArthurOutputDev::drawChar(GfxState *state, double x, double y, state->transform(fontPath->pts[i].x+x, -fontPath->pts[i].y+y, &x1, &y1); qPath.lineTo(x1,y1); } - if (fontPath->flags[i] & splashPathLast) { - qPath.closeSubpath(); - } } GfxRGB rgb; QColor brushColour = m_currentBrush.color(); state->getFillRGB(&rgb); brushColour.setRgbF(colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b), state->getFillOpacity()); m_painter->setBrush(brushColour); - QColor penColour = m_currentPen.color(); - state->getStrokeRGB(&rgb); - penColour.setRgbF(colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b), state->getStrokeOpacity()); - m_painter->setPen(penColour); - m_painter->drawPath( qPath ); + m_painter->setPen(Qt::NoPen); + m_painter->drawPath(qPath); delete fontPath; } } diff --git a/qt5/src/ArthurOutputDev.cc b/qt5/src/ArthurOutputDev.cc index 5d57e93..914edb9 100644 --- a/qt5/src/ArthurOutputDev.cc +++ b/qt5/src/ArthurOutputDev.cc @@ -21,6 +21,7 @@ // Copyright (C) 2010 Matthias Fauconneau <[email protected]> // Copyright (C) 2011 Andreas Hartmetz <[email protected]> // Copyright (C) 2013 Thomas Freitag <[email protected]> +// Copyright (C) 2013 Dominik Haumann <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -593,10 +594,15 @@ void ArthurOutputDev::drawChar(GfxState *state, double x, double y, QPainterPath qPath; qPath.setFillRule(Qt::WindingFill); for (int i = 0; i < fontPath->length; ++i) { + // SplashPath.flags: bitwise or allowed + if (fontPath->flags[i] & splashPathLast || fontPath->flags[i] & splashPathClosed) { + qPath.closeSubpath(); + } if (fontPath->flags[i] & splashPathFirst) { state->transform(fontPath->pts[i].x+x, -fontPath->pts[i].y+y, &x1, &y1); qPath.moveTo(x1,y1); - } else if (fontPath->flags[i] & splashPathCurve) { + } + if (fontPath->flags[i] & splashPathCurve) { state->transform(fontPath->pts[i].x+x, -fontPath->pts[i].y+y, &x1, &y1); state->transform(fontPath->pts[i+1].x+x, -fontPath->pts[i+1].y+y, &x2, &y2); qPath.quadTo(x1,y1,x2,y2); @@ -610,20 +616,14 @@ void ArthurOutputDev::drawChar(GfxState *state, double x, double y, state->transform(fontPath->pts[i].x+x, -fontPath->pts[i].y+y, &x1, &y1); qPath.lineTo(x1,y1); } - if (fontPath->flags[i] & splashPathLast) { - qPath.closeSubpath(); - } } GfxRGB rgb; QColor brushColour = m_currentBrush.color(); state->getFillRGB(&rgb); brushColour.setRgbF(colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b), state->getFillOpacity()); m_painter->setBrush(brushColour); - QColor penColour = m_currentPen.color(); - state->getStrokeRGB(&rgb); - penColour.setRgbF(colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b), state->getStrokeOpacity()); - m_painter->setPen(penColour); - m_painter->drawPath( qPath ); + m_painter->setPen(Qt::NoPen); + m_painter->drawPath(qPath); delete fontPath; } } commit 02863f683be4543a2af6c26d53be93785d2b836a Author: Albert Astals Cid <[email protected]> Date: Thu Dec 12 23:09:43 2013 +0100 qt: Simple silly test program to save to file Allows us to do some quick arthur testing diff --git a/qt4/tests/CMakeLists.txt b/qt4/tests/CMakeLists.txt index 69e9c49..4f16f24 100644 --- a/qt4/tests/CMakeLists.txt +++ b/qt4/tests/CMakeLists.txt @@ -38,6 +38,7 @@ endmacro(QT4_ADD_QTEST) qt4_add_simpletest(test-poppler-qt4 test-poppler-qt4.cpp) qt4_add_simpletest(test-password-qt4 test-password-qt4.cpp) +qt4_add_simpletest(test-render-to-file test-render-to-file.cpp) qt4_add_simpletest(poppler-forms poppler-forms.cpp) qt4_add_simpletest(poppler-fonts poppler-fonts.cpp) qt4_add_simpletest(poppler_attachments poppler-attachments.cpp) diff --git a/qt4/tests/Makefile.am b/qt4/tests/Makefile.am index 8efe124..4e4b210 100644 --- a/qt4/tests/Makefile.am +++ b/qt4/tests/Makefile.am @@ -20,7 +20,7 @@ SUFFIXES: .moc noinst_PROGRAMS = test-poppler-qt4 stress-poppler-qt4 \ poppler-fonts test-password-qt4 stress-poppler-dir \ poppler-attachments poppler-texts poppler-forms \ - stress-threads-qt4 + stress-threads-qt4 test-render-to-file test_poppler_qt4_SOURCES = \ @@ -29,6 +29,12 @@ test_poppler_qt4_SOURCES = \ test_poppler_qt4_LDADD = $(LDADDS) +test_render_to_file_SOURCES = \ + test-render-to-file.cpp + +test_render_to_file_LDADD = $(LDADDS) + + test_password_qt4_SOURCES = \ test-password-qt4.cpp diff --git a/qt4/tests/test-render-to-file.cpp b/qt4/tests/test-render-to-file.cpp new file mode 100644 index 0000000..b01aa03 --- /dev/null +++ b/qt4/tests/test-render-to-file.cpp @@ -0,0 +1,69 @@ +#include <QtCore/QDebug> +#include <QtCore/QFile> +#include <QtGui/QApplication> +#include <QtGui/QImage> + +#include <poppler-qt4.h> + +int main( int argc, char **argv ) +{ + QApplication a( argc, argv ); // QApplication required! + + if ( argc < 2 || + (argc == 3 && strcmp(argv[2], "-arthur") != 0) || + argc > 3) + { + // use argument as file name + qWarning() << "usage: test-poppler-qt4 filename [-arthur]"; + exit(1); + } + + Poppler::Document *doc = Poppler::Document::load(QFile::decodeName(argv[1])); + if (!doc) + { + qWarning() << "doc not loaded"; + exit(1); + } + + if (doc->isLocked()) + { + qWarning() << "document locked (needs password)"; + exit(0); + } + + if (doc->numPages() <= 0) + { + delete doc; + qDebug() << "Doc has no pages"; + return 0; + } + + QString backendString; + if (argc == 3 && strcmp(argv[2], "-arthur") == 0) + { + backendString = "Arthur"; + doc->setRenderBackend(Poppler::Document::ArthurBackend); + } + else + { + backendString = "Splash"; + doc->setRenderBackend(Poppler::Document::SplashBackend); + } + doc->setRenderHint(Poppler::Document::Antialiasing, true); + doc->setRenderHint(Poppler::Document::TextAntialiasing, true); + + for (int i = 0; i < doc->numPages(); ++i) + { + Poppler::Page *page = doc->page(i); + if (page) { + qDebug() << "Rendering page using" << backendString << "backend: " << i; + QTime t = QTime::currentTime(); + QImage image = page->renderToImage(); + qDebug() << "Rendering took" << t.msecsTo(QTime::currentTime()) << "msecs"; + image.save(QString("test-rennder-to-file%1.ppm").arg(i)); + delete page; + } + } + + return 0; +} diff --git a/qt5/tests/CMakeLists.txt b/qt5/tests/CMakeLists.txt index dfeb1fb..ae0bd6c 100644 --- a/qt5/tests/CMakeLists.txt +++ b/qt5/tests/CMakeLists.txt @@ -47,6 +47,7 @@ endmacro(QT5_ADD_QTEST) qt5_add_simpletest(test-poppler-qt5 test-poppler-qt5.cpp) qt5_add_simpletest(test-password-qt5 test-password-qt5.cpp) +qt5_add_simpletest(test-render-to-file test-render-to-file.cpp) qt5_add_simpletest(poppler-forms poppler-forms.cpp) qt5_add_simpletest(poppler-fonts poppler-fonts.cpp) qt5_add_simpletest(poppler_attachments poppler-attachments.cpp) diff --git a/qt5/tests/Makefile.am b/qt5/tests/Makefile.am index be9fa44..b3eecef 100644 --- a/qt5/tests/Makefile.am +++ b/qt5/tests/Makefile.am @@ -20,7 +20,7 @@ SUFFIXES: .moc noinst_PROGRAMS = test-poppler-qt5 stress-poppler-qt5 \ poppler-fonts test-password-qt5 stress-poppler-dir \ poppler-attachments poppler-texts poppler-forms \ - stress-threads-qt5 + stress-threads-qt5 test-render-to-file test_poppler_qt5_SOURCES = \ @@ -29,6 +29,12 @@ test_poppler_qt5_SOURCES = \ test_poppler_qt5_LDADD = $(LDADDS) +test_render_to_file_SOURCES = \ + test-render-to-file.cpp + +test_render_to_file_LDADD = $(LDADDS) + + test_password_qt5_SOURCES = \ test-password-qt5.cpp diff --git a/qt5/tests/test-render-to-file.cpp b/qt5/tests/test-render-to-file.cpp new file mode 100644 index 0000000..5f86da4 --- /dev/null +++ b/qt5/tests/test-render-to-file.cpp @@ -0,0 +1,69 @@ +#include <QtCore/QDebug> +#include <QtCore/QFile> +#include <QGuiApplication> +#include <QImage> + +#include <poppler-qt5.h> + +int main( int argc, char **argv ) +{ + QGuiApplication a( argc, argv ); // QApplication required! + + if ( argc < 2 || + (argc == 3 && strcmp(argv[2], "-arthur") != 0) || + argc > 3) + { + // use argument as file name + qWarning() << "usage: test-poppler-qt4 filename [-arthur]"; + exit(1); + } + + Poppler::Document *doc = Poppler::Document::load(QFile::decodeName(argv[1])); + if (!doc) + { + qWarning() << "doc not loaded"; + exit(1); + } + + if (doc->isLocked()) + { + qWarning() << "document locked (needs password)"; + exit(0); + } + + if (doc->numPages() <= 0) + { + delete doc; + qDebug() << "Doc has no pages"; + return 0; + } + + QString backendString; + if (argc == 3 && strcmp(argv[2], "-arthur") == 0) + { + backendString = "Arthur"; + doc->setRenderBackend(Poppler::Document::ArthurBackend); + } + else + { + backendString = "Splash"; + doc->setRenderBackend(Poppler::Document::SplashBackend); + } + doc->setRenderHint(Poppler::Document::Antialiasing, true); + doc->setRenderHint(Poppler::Document::TextAntialiasing, true); + + for (int i = 0; i < doc->numPages(); ++i) + { + Poppler::Page *page = doc->page(i); + if (page) { + qDebug() << "Rendering page using" << backendString << "backend: " << i; + QTime t = QTime::currentTime(); + QImage image = page->renderToImage(); + qDebug() << "Rendering took" << t.msecsTo(QTime::currentTime()) << "msecs"; + image.save(QString("test-rennder-to-file%1.ppm").arg(i)); + delete page; + } + } + + return 0; +} _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
