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