10 changes: 6 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,12 @@ ADD_CUSTOM_TARGET(version ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/qgsversion.h)
#############################################################
# process subdirs

#create a variable to specify where our test data is
#so that unit tests can use TEST_DATA_DIR to locate
#the test data. See CMakeLists in test dirs for more info
#TEST_DATA_DIR is also used by QgsRenderChecker currently in core
SET (TEST_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests/testdata")

ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(doc)
ADD_SUBDIRECTORY(images)
Expand All @@ -570,10 +576,6 @@ IF (WITH_BINDINGS)
ENDIF (WITH_BINDINGS)

IF (ENABLE_TESTS)
#create a variable to specify where our test data is
#so that unit tests can use TEST_DATA_DIR to locate
#the test data. See CMakeLists in test dirs for more info
SET (TEST_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests/testdata")
ADD_SUBDIRECTORY(tests)
SET (CTEST_BINARY_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/output/bin" )
MESSAGE (STATUS "Ctest Binary Directory set to: ${CTEST_BINARY_DIRECTORY}")
Expand Down
1 change: 1 addition & 0 deletions python/core/core.sip
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
%Include qgsrectangle.sip
%Include qgsrendercontext.sip
%Include qgsrenderer.sip
%Include qgsrenderchecker.sip
%Include qgsrunprocess.sip
%Include qgsscalecalculator.sip
%Include qgssinglesymbolrenderer.sip
Expand Down
9 changes: 9 additions & 0 deletions python/core/qgsrasterlayer.sip
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,15 @@ public:
Multiband
} ;

/** \brief Contrast enhancement limits */
enum ContrastEnhancementLimits
{
ContrastEnhancementNone,
ContrastEnhancementMinMax,
ContrastEnhancementStdDev,
ContrastEnhancementCumulativeCut
};

/** \brief A list containing on ContrastEnhancement object per raster band in this raster layer */
typedef QList<QgsContrastEnhancement> ContrastEnhancementList;

Expand Down
43 changes: 43 additions & 0 deletions python/core/qgsrenderchecker.sip
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@

/** Render checker for tests in python */

class QgsRenderChecker
{
%TypeHeaderCode
#include <qgsrenderchecker.h>
%End
public:

QgsRenderChecker();

~QgsRenderChecker();

QString controlImagePath() const;

QString report();

float matchPercent();

unsigned int mismatchCount();

unsigned int matchTarget();

int elapsedTime();

void setControlName( const QString theName );

void setControlPathPrefix( const QString theName );

QString imageToHash( QString theImageFile );

void setRenderedImage( QString theImageFileName );

void setMapRenderer( QgsMapRenderer * thepMapRenderer );

bool runTest( QString theTestName, unsigned int theMismatchCount = 0 );

bool compareImages( QString theTestName, unsigned int theMismatchCount = 0, QString theRenderedImageFile = "" );

bool isKnownAnomaly( QString theDiffImageFile );
};

6 changes: 6 additions & 0 deletions src/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ SET(QGIS_CORE_SRCS
qgsrasterprojector.cpp
qgsrasterdataprovider.cpp
qgsrendercontext.cpp
qgsrenderchecker.cpp
qgsrectangle.cpp
qgsrunprocess.cpp
qgsscalecalculator.cpp
Expand Down Expand Up @@ -376,6 +377,7 @@ SET(QGIS_CORE_HDRS
qgsrasterdataprovider.h
qgsrectangle.h
qgsrendercontext.h
qgsrenderchecker.h
qgsrunprocess.h
qgsscalecalculator.h
qgssnapper.h
Expand Down Expand Up @@ -492,6 +494,9 @@ ELSE (WIN32)
ADD_DEFINITIONS("-D_HAVE_PTHREAD_")
ENDIF (WIN32)

# Test data dir for QgsRenderChecker
ADD_DEFINITIONS(-DTEST_DATA_DIR="\\"${TEST_DATA_DIR}\\"")

#############################################################
# qgis_core library

Expand Down Expand Up @@ -581,3 +586,4 @@ IF (APPLE AND QGIS_MACAPP_INSTALL_DEV)
INSTALL(TARGETS qgis_core FRAMEWORK DESTINATION ${QGIS_MACAPP_DEV_PREFIX})
INSTALL(CODE "EXECUTE_PROCESS(COMMAND install_name_tool -id \"${QGIS_MACAPP_DEV_PREFIX}/qgis_core.framework/Versions/${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}/qgis_core\" \"$ENV{DESTDIR}${QGIS_MACAPP_DEV_PREFIX}/qgis_core.framework/qgis_core\")")
ENDIF (APPLE AND QGIS_MACAPP_INSTALL_DEV)

File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion tests/src/analysis/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Standard includes and utils to compile into all tests.
SET (util_SRCS ../core/qgsrenderchecker.cpp)
SET (util_SRCS)


#####################################################
Expand Down
2 changes: 1 addition & 1 deletion tests/src/core/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Standard includes and utils to compile into all tests.
SET (util_SRCS qgsrenderchecker.cpp qgscompositionchecker.cpp)
SET (util_SRCS qgscompositionchecker.cpp)


#####################################################
Expand Down
59 changes: 56 additions & 3 deletions tests/src/core/testqgsrasterlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,10 @@
#include <qgsapplication.h>
#include <qgsmaprenderer.h>
#include <qgsmaplayerregistry.h>
#include "qgssinglebandpseudocolorrenderer.h"
#include "qgsvectorcolorrampv2.h"
#include "qgscptcityarchive.h"
#include <qgssinglebandgrayrenderer.h>
#include <qgssinglebandpseudocolorrenderer.h>
#include <qgsvectorcolorrampv2.h>
#include <qgscptcityarchive.h>

//qgis unit test includes
#include <qgsrenderchecker.h>
Expand Down Expand Up @@ -67,6 +68,7 @@ class TestQgsRasterLayer: public QObject
void checkStats();
void buildExternalOverviews();
void registry();
void transparency();
private:
bool render( QString theFileName );
bool setQml( QString theType );
Expand All @@ -78,6 +80,7 @@ class TestQgsRasterLayer: public QObject
QString mTestDataDir;
QgsRasterLayer * mpRasterLayer;
QgsRasterLayer * mpLandsatRasterLayer;
QgsRasterLayer * mpFloat32RasterLayer;
QgsMapRenderer * mpMapRenderer;
QString mReport;
};
Expand All @@ -97,19 +100,31 @@ void TestQgsRasterLayer::initTestCase()
mTestDataDir = QString( TEST_DATA_DIR ) + QDir::separator(); //defined in CmakeLists.txt
QString myFileName = mTestDataDir + "tenbytenraster.asc";
QString myLandsatFileName = mTestDataDir + "landsat.tif";
QString myFloat32FileName = mTestDataDir + "/raster/band1_float32_noct_epsg4326.tif";

QFileInfo myRasterFileInfo( myFileName );
mpRasterLayer = new QgsRasterLayer( myRasterFileInfo.filePath(),
myRasterFileInfo.completeBaseName() );
qDebug() << "tenbyteraster metadata: " << mpRasterLayer->dataProvider()->metadata();

QFileInfo myLandsatRasterFileInfo( myLandsatFileName );
mpLandsatRasterLayer = new QgsRasterLayer( myLandsatRasterFileInfo.filePath(),
myLandsatRasterFileInfo.completeBaseName() );
qDebug() << "landsat metadata: " << mpLandsatRasterLayer->dataProvider()->metadata();

QFileInfo myFloat32RasterFileInfo( myFloat32FileName );
mpFloat32RasterLayer = new QgsRasterLayer( myFloat32RasterFileInfo.filePath(),
myFloat32RasterFileInfo.completeBaseName() );
qDebug() << "float32raster metadata: " << mpFloat32RasterLayer->dataProvider()->metadata();

// Register the layer with the registry
QgsMapLayerRegistry::instance()->addMapLayers(
QList<QgsMapLayer *>() << mpRasterLayer );
QgsMapLayerRegistry::instance()->addMapLayers(
QList<QgsMapLayer *>() << mpLandsatRasterLayer );
QgsMapLayerRegistry::instance()->addMapLayers(
QList<QgsMapLayer *>() << mpFloat32RasterLayer );

// add the test layer to the maprender
mpMapRenderer = new QgsMapRenderer();
QStringList myLayers;
Expand Down Expand Up @@ -425,5 +440,43 @@ bool TestQgsRasterLayer::setQml( QString theType )
return myStyleFlag;
}

void TestQgsRasterLayer::transparency()
{
QVERIFY( mpFloat32RasterLayer->isValid() );
QgsSingleBandGrayRenderer* renderer = new QgsSingleBandGrayRenderer( mpRasterLayer->dataProvider(), 1 );
mpFloat32RasterLayer->setRenderer( renderer );
mpFloat32RasterLayer->setContrastEnhancementAlgorithm( QgsContrastEnhancement::StretchToMinimumMaximum, QgsRasterLayer::ContrastEnhancementMinMax );

qDebug( "contrastEnhancement.minimumValue = %.17g", renderer->contrastEnhancement()->minimumValue() );
qDebug( "contrastEnhancement.maximumValue = %.17g", renderer->contrastEnhancement()->maximumValue() );

QList<QgsRasterTransparency::TransparentSingleValuePixel> myTransparentSingleValuePixelList;
QgsRasterTransparency* rasterTransparency = new QgsRasterTransparency();
QgsRasterTransparency::TransparentSingleValuePixel myTransparentPixel;

myTransparentPixel.min = -2.5840000772112106e+38;
myTransparentPixel.max = -1.0879999684602689e+38;
myTransparentPixel.percentTransparent = 50;
myTransparentSingleValuePixelList.append( myTransparentPixel );

myTransparentPixel.min = 1.359999960575336e+37;
myTransparentPixel.max = 9.520000231087593e+37;
myTransparentPixel.percentTransparent = 70;
myTransparentSingleValuePixelList.append( myTransparentPixel );

rasterTransparency->setTransparentSingleValuePixelList( myTransparentSingleValuePixelList );

QgsRasterRenderer* rasterRenderer = mpFloat32RasterLayer->renderer();
QVERIFY( rasterRenderer != 0 );
rasterRenderer->setRasterTransparency( rasterTransparency );

QStringList myLayers;
myLayers << mpFloat32RasterLayer->id();
mpMapRenderer->setLayerSet( myLayers );

mpMapRenderer->setExtent( mpFloat32RasterLayer->extent() );
QVERIFY( render( "raster_transparency" ) );
}

QTEST_MAIN( TestQgsRasterLayer )
#include "moc_testqgsrasterlayer.cxx"
2 changes: 1 addition & 1 deletion tests/src/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Standard includes and utils to compile into all tests.
SET (util_SRCS ../core/qgsrenderchecker.cpp)
SET (util_SRCS)


#####################################################
Expand Down
67 changes: 65 additions & 2 deletions tests/src/python/test_qgsrasterlayer.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import os
import unittest

from qgis.core import QgsRasterLayer, QgsPoint
from PyQt4.QtCore import QFileInfo, QString
from qgis.core import QgsRasterLayer, QgsPoint, QgsMapLayerRegistry, QgsMapRenderer, QgsSingleBandGrayRenderer, QgsContrastEnhancement, QgsRasterTransparency, QgsRenderChecker
from PyQt4.QtCore import QFileInfo, QString, QStringList

# Convenience instances in case you may need them
# not used in this test
Expand Down Expand Up @@ -40,6 +40,69 @@ def testIdentify(self):
myMessage = 'Expected: %s\nGot: %s' % (myValues, myExpectedValues)
self.assertEquals(myValues, myExpectedValues, myMessage)

def testTransparency(self):
myPath = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'testdata', 'raster', 'band1_float32_noct_epsg4326.tif'))
myFileInfo = QFileInfo(myPath)
myBaseName = myFileInfo.baseName()
myRasterLayer = QgsRasterLayer(myPath, myBaseName)
myMessage = 'Raster not loaded: %s' % myPath
assert myRasterLayer.isValid(), myMessage

renderer = QgsSingleBandGrayRenderer( myRasterLayer.dataProvider(), 1 );
myRasterLayer.setRenderer( renderer );
myRasterLayer.setContrastEnhancementAlgorithm( QgsContrastEnhancement.StretchToMinimumMaximum, QgsRasterLayer.ContrastEnhancementMinMax );

myContrastEnhancement = myRasterLayer.renderer().contrastEnhancement()
#print "myContrastEnhancement.minimumValue = %.17g" % myContrastEnhancement.minimumValue()
#print "myContrastEnhancement.maximumValue = %.17g" % myContrastEnhancement.maximumValue()

# Unfortunately the minimum/maximum values calculated in C++ and Python
# are slightely different (e.g. 3.3999999521443642e+38 x 3.3999999521444001e+38)
# It is not clear where the precision is lost. We set the same values as C++.
myContrastEnhancement.setMinimumValue( -3.3319999287625854e+38 )
myContrastEnhancement.setMaximumValue( 3.3999999521443642e+38 )
#myType = myRasterLayer.dataProvider().dataType( 1 );
#myEnhancement = QgsContrastEnhancement( myType );



myTransparentSingleValuePixelList = []
rasterTransparency = QgsRasterTransparency()

myTransparentPixel1 = QgsRasterTransparency.TransparentSingleValuePixel()
myTransparentPixel1.min = -2.5840000772112106e+38
myTransparentPixel1.max = -1.0879999684602689e+38
myTransparentPixel1.percentTransparent = 50
myTransparentSingleValuePixelList.append( myTransparentPixel1 )

myTransparentPixel2 = QgsRasterTransparency.TransparentSingleValuePixel()
myTransparentPixel2.min = 1.359999960575336e+37
myTransparentPixel2.max = 9.520000231087593e+37
myTransparentPixel2.percentTransparent = 70
myTransparentSingleValuePixelList.append( myTransparentPixel2 )

rasterTransparency.setTransparentSingleValuePixelList( myTransparentSingleValuePixelList )

rasterRenderer = myRasterLayer.renderer()
assert rasterRenderer

rasterRenderer.setRasterTransparency( rasterTransparency )

QgsMapLayerRegistry.instance().addMapLayers( [ myRasterLayer, ] )

myMapRenderer = QgsMapRenderer()

myLayers = QStringList()
myLayers.append( myRasterLayer.id() )
myMapRenderer.setLayerSet( myLayers )
myMapRenderer.setExtent( myRasterLayer.extent() )

myChecker = QgsRenderChecker()
myChecker.setControlName( "expected_raster_transparency" )
myChecker.setMapRenderer( myMapRenderer )

myResultFlag = myChecker.runTest( "raster_transparency_python" );
assert myResultFlag, "Raster transparency rendering test failed"

if __name__ == '__main__':
unittest.main()
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<PAMDataset>
<Metadata domain="IMAGE_STRUCTURE">
<MDI key="INTERLEAVE">PIXEL</MDI>
</Metadata>
<PAMRasterBand band="1">
<Metadata>
<MDI key="STATISTICS_MAXIMUM">255</MDI>
<MDI key="STATISTICS_MEAN">144.08</MDI>
<MDI key="STATISTICS_MINIMUM">0</MDI>
<MDI key="STATISTICS_STDDEV">62.006238395826</MDI>
</Metadata>
</PAMRasterBand>
<PAMRasterBand band="2">
<Metadata>
<MDI key="STATISTICS_MAXIMUM">255</MDI>
<MDI key="STATISTICS_MEAN">165.72</MDI>
<MDI key="STATISTICS_MINIMUM">0</MDI>
<MDI key="STATISTICS_STDDEV">67.364394155963</MDI>
</Metadata>
</PAMRasterBand>
<PAMRasterBand band="3">
<Metadata>
<MDI key="STATISTICS_MAXIMUM">255</MDI>
<MDI key="STATISTICS_MEAN">175.38</MDI>
<MDI key="STATISTICS_MINIMUM">0</MDI>
<MDI key="STATISTICS_STDDEV">73.064872544883</MDI>
</Metadata>
</PAMRasterBand>
</PAMDataset>
10 changes: 10 additions & 0 deletions tests/testdata/raster/band1_float32_noct_epsg4326.tif.aux.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
<PAMDataset>
<PAMRasterBand band="1">
<Histograms>
<HistItem>
<HistMin>-3.365659928167135e+38</HistMin>
<HistMax>3.433659951548935e+38</HistMax>
<BucketCount>100</BucketCount>
<IncludeOutOfRange>0</IncludeOutOfRange>
<Approximate>0</Approximate>
<HistCounts>1|1|0|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|1|1|0|0|0|0|0|0|0|0|0|0|1|1|0|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|1|1|1|1|0|1|1|1|1|1|1|1</HistCounts>
</HistItem>
</Histograms>
<Metadata>
<MDI key="COLOR_TABLE_RULE_RGB_0">0.000000e+00 0.000000e+00 255 127 0 255 127 0</MDI>
<MDI key="COLOR_TABLE_RULES_COUNT">1</MDI>
Expand Down