1# -*- coding: utf-8 -*- 2''' 3qgslayoutchecker.py - check rendering of QgsLayout against an expected image 4 -------------------------------------- 5 Date : 31 Juli 2012 6 Copyright : (C) 2012 by Dr. Horst Düster / Dr. Marco Hugentobler 7 email : horst.duester@sourcepole.ch 8 *************************************************************************** 9 * * 10 * This program is free software; you can redistribute it and/or modify * 11 * it under the terms of the GNU General Public License as published by * 12 * the Free Software Foundation; either version 2 of the License, or * 13 * (at your option) any later version. * 14 * * 15 ***************************************************************************/ 16''' 17 18import qgis # NOQA 19 20from qgis.PyQt.QtCore import QSize, QDir, QFileInfo 21from qgis.PyQt.QtGui import QImage, QPainter 22from qgis.core import QgsMultiRenderChecker, QgsLayoutExporter 23 24 25class QgsLayoutChecker(QgsMultiRenderChecker): 26 27 def __init__(self, test_name, layout): 28 super(QgsLayoutChecker, self).__init__() 29 self.layout = layout 30 self.test_name = test_name 31 self.dots_per_meter = 96 / 25.4 * 1000 32 self.size = QSize(1122, 794) 33 self.setColorTolerance(5) 34 35 def testLayout(self, page=0, pixelDiff=0): 36 if self.layout is None: 37 myMessage = "Layout not valid" 38 return False, myMessage 39 40 # load expected image 41 self.setControlName("expected_" + self.test_name) 42 43 # get width/height, create image and render the composition to it 44 outputImage = QImage(self.size, QImage.Format_RGB32) 45 46 outputImage.setDotsPerMeterX(self.dots_per_meter) 47 outputImage.setDotsPerMeterY(self.dots_per_meter) 48 QgsMultiRenderChecker.drawBackground(outputImage) 49 p = QPainter(outputImage) 50 exporter = QgsLayoutExporter(self.layout) 51 exporter.renderPage(p, page) 52 p.end() 53 54 renderedFilePath = QDir.tempPath() + QDir.separator() + QFileInfo(self.test_name).baseName() + "_rendered.png" 55 outputImage.save(renderedFilePath, "PNG") 56 57 self.setRenderedImage(renderedFilePath) 58 59 testResult = self.runTest(self.test_name, pixelDiff) 60 61 return testResult, self.report() 62