Add testing of QPdfWriter output to QPainter lancelot test

Utilizes the native pdf renderer of macOS, so the test is only enabled
on that platform. As the PDF generation should be platform independent
anyway, this should not matter.

Pick-to: 6.2 5.15
Change-Id: I8b6b70562d1f24fdb77795aa7eb5843279aaae85
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
Eirik Aavitsland 2021-09-23 10:00:22 +02:00
parent fbd3b00e0b
commit 5e2725772a
2 changed files with 103 additions and 1 deletions

View File

@ -0,0 +1,55 @@
drawRect 0 0 800 800
setRenderHint Antialiasing true
image_load dome_argb32.png img
save
setBrush springgreen SolidPattern
begin_block primitives
setPen black 2 DashLine
pen_setCosmetic true
drawLine 10 60 60 10
drawRect 80 10.0 30 50
drawText 130 50 "Foo"
drawImage img 160 10 50 50
pen_setCosmetic false
drawLine 10 160 60 110
drawRect 80 110.0 30 50
drawText 130 150 "Foo"
drawImage img 160 110 50 50
setPen NoPen
drawLine 10 260 60 210
drawRect 80 210.0 30 50
drawText 130 250 "Foo"
drawImage img 160 210 50 50
end_block primitives
translate 250 0
rotate 10
scale 2.5 1
repeat_block primitives
resetMatrix
# Force non-simple pen in Pdf
setOpacity 0.5
translate 0 400
repeat_block primitives
translate 250 0
rotate 10
scale 2.5 1
repeat_block primitives
restore
setPen blue 4 DotLine
setBrush olive SolidPattern
pen_setCosmetic true
translate 50 720
scale 2 2
drawRect 0 0 30 30

View File

@ -30,6 +30,9 @@
#include <qbaselinetest.h>
#include <QDir>
#include <QPainter>
#include <QPdfWriter>
#include <QTemporaryFile>
#include <QProcess>
#ifndef QT_NO_OPENGL
#include <QOpenGLFramebufferObjectFormat>
@ -56,7 +59,8 @@ public:
private:
enum GraphicsEngine {
Raster = 0,
OpenGL = 1
OpenGL = 1,
Pdf = 2
};
void setupTestSuite(const QStringList& blacklist = QStringList());
@ -95,6 +99,9 @@ private slots:
void testRasterRGBA32FPM_data();
void testRasterRGBA32FPM();
void testPdf_data();
void testPdf();
#ifndef QT_NO_OPENGL
void testOpenGL_data();
void testOpenGL();
@ -267,6 +274,21 @@ void tst_Lancelot::testRasterRGBA32FPM()
}
void tst_Lancelot::testPdf_data()
{
#ifdef Q_OS_MACOS
setupTestSuite();
#else
QSKIP("Pdf testing only implemented for macOS");
#endif
}
void tst_Lancelot::testPdf()
{
runTestSuite(Pdf, QImage::Format_RGB32);
}
#ifndef QT_NO_OPENGL
bool tst_Lancelot::checkSystemGLSupport()
{
@ -398,6 +420,28 @@ void tst_Lancelot::runTestSuite(GraphicsEngine engine, QImage::Format format, co
paint(&pdv, engine, format, script, QFileInfo(filePath).absoluteFilePath());
rendered = fbo.toImage().convertToFormat(format);
#endif
} else if (engine == Pdf) {
QString tempStem(QDir::tempPath() + QLatin1String("/lancelot_XXXXXX_") + qpsFile.chopped(4));
QTemporaryFile pdfFile(tempStem + QLatin1String(".pdf"));
pdfFile.open();
QPdfWriter writer(&pdfFile);
writer.setPdfVersion(QPdfWriter::PdfVersion_1_6);
writer.setResolution(150);
paint(&writer, engine, format, script, QFileInfo(filePath).absoluteFilePath());
pdfFile.close();
// Convert pdf to something we can read into a QImage, using macOS' sips utility
QTemporaryFile pngFile(tempStem + QLatin1String(".png"));
pngFile.open(); // Just create the file name
pngFile.close();
QProcess proc;
const char *rawArgs = "-s format png --cropOffset 20 20 -c 800 800 -o";
QStringList argList = QString::fromLatin1(rawArgs).split(QLatin1Char(' '));
proc.start(QLatin1String("sips"), argList << pngFile.fileName() << pdfFile.fileName());
proc.waitForFinished(2 * 60 * 1000); // May need some time
rendered = QImage(pngFile.fileName());
}
QBASELINE_TEST(rendered);
@ -412,6 +456,9 @@ void tst_Lancelot::paint(QPaintDevice *device, GraphicsEngine engine, QImage::Fo
case OpenGL:
pcmd.setType(OpenGLBufferType); // version/profile is communicated through the context's format()
break;
case Pdf:
pcmd.setType(PdfType);
break;
case Raster: // fallthrough
default:
pcmd.setType(ImageType);