Skip to content
Permalink
Browse files

add rendering tests for HiDPI (device pixel ratio)

  • Loading branch information
3nids committed Oct 23, 2018
1 parent 3ff8477 commit 49e8e860293452c5869e01f37c70e1fb3778b660
@@ -182,7 +182,7 @@ bool QgsRenderChecker::runTest( const QString &testName,
//
mMapSettings.setBackgroundColor( qRgb( 152, 219, 249 ) );
mMapSettings.setFlag( QgsMapSettings::Antialiasing );
mMapSettings.setOutputSize( QSize( myExpectedImage.width(), myExpectedImage.height() ) );
mMapSettings.setOutputSize( QSize( myExpectedImage.width(), myExpectedImage.height() ) / mMapSettings.devicePixelRatio() );

QTime myTime;
myTime.start();
@@ -194,6 +194,7 @@ bool QgsRenderChecker::runTest( const QString &testName,
mElapsedTime = myTime.elapsed();

QImage myImage = job.renderedImage();
Q_ASSERT( myImage.devicePixelRatioF() == mMapSettings.devicePixelRatio() );

//
// Save the pixmap to disk so the user can make a
@@ -147,6 +147,7 @@ SET(TESTS
testqgslegendrenderer.cpp
testqgscentroidfillsymbol.cpp
testqgslinefillsymbol.cpp
testqgsmapdevicepixelratio.cpp
testqgsmaplayerstylemanager.cpp
testqgsmaplayer.cpp
testqgsmaprendererjob.cpp
@@ -0,0 +1,136 @@
/***************************************************************************
TestQgsMapDevicePixelRatio.cpp
--------------------------------------
Date : October 2018
Copyright : (C) 2018 by Denis Rouzaud
Email : denis@opengis.ch
***************************************************************************
* *
* 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 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include <QObject>
#include <QString>
#include <QStringList>
#include <QApplication>
#include <QFileInfo>
#include <QDir>
#include <QFile>
#include <QIODevice>

#include "qgstest.h"
#include "qgsvectorlayer.h"
#include "qgsfontutils.h"
#include "qgsmapsettings.h"

//qgis unit test includes
#include <qgsrenderchecker.h>

/**
* \ingroup UnitTests
* This is a unit test for the map rotation feature
*/
class TestQgsMapDevicePixelRatio : public QObject
{
Q_OBJECT
public:
TestQgsMapDevicePixelRatio()
{
mTestDataDir = QStringLiteral( TEST_DATA_DIR ) + '/';
}

~TestQgsMapDevicePixelRatio() override;

private slots:
void initTestCase();// will be called before the first testfunction is executed.
void cleanupTestCase();// will be called after the last testfunction was executed.
void init() {} // will be called before each testfunction is executed.
void cleanup() {} // will be called after every testfunction.

void pointsLayer();

private:
bool render( const QString &fileName, float dpr );

QString mTestDataDir;
QgsVectorLayer *mPointsLayer = nullptr;
QgsMapSettings *mMapSettings = nullptr;
QString mReport;
};

//runs before all tests
void TestQgsMapDevicePixelRatio::initTestCase()
{
// init QGIS's paths - true means that all path will be inited from prefix
QgsApplication::init();
QgsApplication::initQgis();

mMapSettings = new QgsMapSettings();

//create a point layer that will be used in all tests...
QString myPointsFileName = mTestDataDir + "points.shp";
QFileInfo myPointFileInfo( myPointsFileName );
mPointsLayer = new QgsVectorLayer( myPointFileInfo.filePath(),
myPointFileInfo.completeBaseName(), QStringLiteral( "ogr" ) );

mReport += QLatin1String( "<h1>Map Device Pixel Ratio Tests</h1>\n" );

QgsFontUtils::loadStandardTestFonts( QStringList() << QStringLiteral( "Bold" ) );
}

TestQgsMapDevicePixelRatio::~TestQgsMapDevicePixelRatio() = default;

//runs after all tests
void TestQgsMapDevicePixelRatio::cleanupTestCase()
{
delete mMapSettings;
delete mPointsLayer;
QgsApplication::exitQgis();

QString myReportFile = QDir::tempPath() + "/qgistest.html";
QFile myFile( myReportFile );
if ( myFile.open( QIODevice::WriteOnly | QIODevice::Append ) )
{
QTextStream myQTextStream( &myFile );
myQTextStream << mReport;
myFile.close();
}
}

void TestQgsMapDevicePixelRatio::pointsLayer()
{
mMapSettings->setLayers( QList<QgsMapLayer *>() << mPointsLayer );

QString qml = mTestDataDir + "points.qml";
bool success = false;
mPointsLayer->loadNamedStyle( qml, success );
QVERIFY( success );
QVERIFY( render( "dpr-normal", 1 ) );
QVERIFY( render( "dpr-2", 2 ) );
QVERIFY( render( "dpr-float", 2.5 ) );
}


bool TestQgsMapDevicePixelRatio::render( const QString &testType, float dpr )
{
mReport += "<h2>" + testType + "</h2>\n";
mMapSettings->setOutputSize( QSize( 256, 256 ) );
mMapSettings->setOutputDpi( 96 );
mMapSettings->setDevicePixelRatio( dpr );
mMapSettings->setExtent( QgsRectangle( -105.5, 37, -97.5, 45 ) );
qDebug() << "scale" << QString::number( mMapSettings->scale(), 'f' );
QgsRenderChecker checker;
checker.setControlPathPrefix( QStringLiteral( "mapdevicepixelratio" ) );
checker.setControlName( "expected_" + testType );
checker.setMapSettings( *mMapSettings );
bool result = checker.runTest( testType );
mReport += "\n\n\n" + checker.report();
return result;
}

QGSTEST_MAIN( TestQgsMapDevicePixelRatio )
#include "testqgsmapdevicepixelratio.moc"
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 comments on commit 49e8e86

Please sign in to comment.
You can’t perform that action at this time.